Powershell 2.0 генерирует нули между символами - PullRequest
13 голосов
/ 27 сентября 2010

С PowerShell 2.0:

write-output "abcd" >> mytext.txt  

возвращает:

nul b nul c nul d nul

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

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

Ответы [ 2 ]

19 голосов
/ 27 сентября 2010

Это связано с тем, что по умолчанию для записи-вывода используется кодировка текста 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, но также обрабатывает международные символы. Обязательная ссылка на кодировку текста .

3 голосов
/ 27 сентября 2010

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

write-output "abcd" | out-file -path mytext.txt -Encoding "UTF8" -Append
...