Powershell 2.0 генерирует нули между символами

С PowerShell 2.0:

write-output "abcd" >> mytext.txt  

возвращает:

а нуль б нуль в нуль д нуль

od -c показывает nul как истинный двоичный ноль, \0 или: a \0 b \0 c \0 d \0\r \0 \n \0).

Я пытаюсь сгенерировать некоторый SQL, поэтому я не думаю, что это сработает. Любые идеи о том, что происходит и как использовать запись-вывод, чтобы просто получить указанные символы?


person cvsdave    schedule 27.09.2010    source источник


Ответы (2)


Это связано с тем, что для вывода по умолчанию используется текстовая кодировка UTF-16, которая составляет 2 байта на символ. Когда вы имеете дело с текстом, который соответствует диапазону кодовых страниц ASCII, 2-й байт каждого символа будет равен нулю.

Это контролируется глобальной переменной $OutputEncoding, поэтому вы можете установить ее в ASCII.

Другой вариант — использовать командлет Out-File с явным параметром кодирования. Я бы посоветовал вам использовать это вместо перенаправления вывода, потому что это избавляет вас от глобального изменения вашей среды (путем установки глобальной переменной предпочтений $OutputEncoding)

Используя Out-File и задав кодировку ASCII, ваш пример будет выглядеть так:

"abcd" | out-file "mytext.txt" -Encoding ASCII

Имейте в виду, что не все символы могут быть представлены в ASCII, и вам следует определить, подходит ли эта кодировка для ваших целей. Лично я обычно использую UTF-8, поскольку он эквивалентен ASCII, когда символы попадают в диапазон ASCII от 0 до 127, но также обрабатывает международные символы. Обязательная ссылка на кодировку текста.

person driis    schedule 27.09.2010
comment
Спасибо за ваш быстрый и полный ответ. В 21 веке никогда не следует ожидать ASCII - как это хорошо описано в статье Джоэла, процитированной выше! - person cvsdave; 27.09.2010
comment
Просто для тех, кто будет рассматривать это как результаты поиска в будущем, out-file поддерживает флаг -append, поэтому я бы использовал: abcd | выходной файл mytext.txt -Кодировка ASCII -дополнение - person cvsdave; 27.09.2010

Powershell по умолчанию работает в 16-битном юникоде, и, тем не менее, вы читаете файл, скорее всего, в 8-битном формате. Вы можете интерпретировать sql в приложении, которое может читать UTF16, или, поскольку >> является синтаксическим сахаром для командлета out-file, вы можете вместо этого сделать следующее:

write-output "abcd" | out-file -path mytext.txt -Encoding "UTF8" -Append
person Dan Monego    schedule 27.09.2010
comment
Спасибо за ваш быстрый ответ - ответ, который мне был нужен, но я могу отметить только один как принятый. - person cvsdave; 27.09.2010