2015-08-21 4 views
0

Я использую команду child_process.exec для запуска команды, которая включает в свой вывод некоторые специальные символы, но они неизменно интерпретируются Node.js в качестве замещающих символов (\uFFFD). Следующий фрагмент кода должен продемонстрировать такое поведение достаточно:Как отображать специальные символы, возвращаемые child_process.exec?

require("child_process").exec("echo äëïöü", function(stderr, stdout) { 
    console.log(stdout); 
}); 

Есть ли способ, я могу определить, что специальные символы возвращаются на выходе на самом деле? Я использую Windows, если это актуально.

ответ

1

По умолчанию encoding для exec() является utf8. Вы можете переопределить это значение по умолчанию и получить исходные буферы, содержащие буквальным двоичных байтов, установив encoding: 'buffer':

require("child_process").exec("echo äëïöü", 
           { encoding: 'buffer' }, 
           function(err, stdout, stderr) { 
    // `stdout` and `stderr` are Buffer instances 
    console.dir(stdout); 
}); 
+0

Какой самый лучший способ отображения необработанных байтов в соответствующие им символы Юникода? Например, буфер, возвращенный в этом примере, заполняется октетами, представленными как '132',' 137', '139',' 148' и '129'. Как перевести это в строку «äëïöü»? – Hydrothermal

+0

Это зависит от вашей среды. Вы можете посмотреть 'process.env.LC_CTYPE' или' process.env.LANG' или выполнить 'locale charmap' в дочернем процессе для определения используемой текущей кодировки. Если это не UTF-8 или любая другая кодировка, для которой узел имеет встроенную поддержку, вам нужно будет изучить с помощью 'iconv' /' iconv-lite' модулей на npm, чтобы делать конверсии для вас. – mscdex

+0

Получил, спасибо! Я использовал 'iconv-lite' для декодирования с использованием моей текущей кодовой страницы (437), и она отлично работает. – Hydrothermal

Смежные вопросы