echo string › файл в Windows PowerShell добавляет к файлу непечатаемый символ

В Windows PowerShell:

echo "string" > file.txt

В Cygwin:

$ cat file.txt
:::s t r i n g

$ dos2unix file.txt
dos2unix: Skipping binary file file.txt

Мне нужна простая "строка" в файле. Как это сделать? То есть, когда я говорю cat file.txt, мне нужна только "строка" в качестве вывода. Я повторяю из Windows PowerShell, и это нельзя изменить.


person Girish Vijay    schedule 17.11.2011    source источник


Ответы (3)


Попробуйте echo "string" | out-file -encoding ASCII file.txt получить простой текстовый файл в кодировке ASCII.

Сравнение полученных файлов:

echo "string" | out-file -encoding ASCII file.txt

создаст файл со следующим содержимым:

73 74 72 69 6E 67 0D 0A (string..)

Однако

echo "string" > file.txt

создаст файл со следующим содержимым:

FF FE 73 00 74 00 72 00 69 00 6E 00 67 00 0D 00 0A 00 (ÿþs.t.r.i.n.g.....)

(Знак порядка байтов FF FE указывает, что файл имеет формат UTF-16 (LE). Подпись для UTF-16 (LE) = 2 байта: 0xFF 0xFE, за которыми следуют 2 пары байтов. xx 00 xx 00 xx 00 для обычного 0-127 ASCII символы

person jon Z    schedule 17.11.2011
comment
Или вы можете запустить iconv -f utf-16 -t ascii в Cygwin, чтобы преобразовать файл из utf-16 в ASCII. - person Keith Thompson; 17.11.2011

Эти две команды эквивалентны в том смысле, что обе они используют кодировку UTF-16 по умолчанию:

echo "string" > file.txt
echo "string" | out-file file.txt

Вы можете добавить явный параметр кодирования к последней форме (как указано jon Z), чтобы получить простой ASCII:

echo "string" | out-file -encoding ASCII file.txt

В качестве альтернативы вы можете использовать set-content, который по умолчанию использует кодировку ASCII:

echo "string" | set-content file.txt

Следствие 1:

Хотите преобразовать файл Unicode в ASCII в одну строку?

Просто используйте это:

get-content your_unicode_file | set-content your_ascii_file

который можно сократить до:

gc your_unicode_file | sc your_ascii_file

Следствие 2:

Хотите получить шестнадцатеричный дамп, чтобы понять, что такое Unicode и что такое ASCII?

Используйте чистый и простой Get-HexDump< Функция /a> доступна на PowerShell.com. Имея это на месте, вы можете проверить свои сгенерированные файлы, просто:

Get-HexDump file.txt

Для чего-либо нетривиального вы можете указать, сколько столбцов в ширину вы хотите вывести и сколько байтов файла обрабатывать примерно так:

Get-HexDump file.txt -width 15 -bytes 150
person Michael Sorens    schedule 17.11.2011

PowerShell создает файлы Unicode UTF-16 с меткой порядка байтов (BOM).

Dos2unix 6.0 и выше может читать файлы UTF-16 и преобразовывать их в UTF-8 (кодировка Cygwin по умолчанию) и удалять спецификацию. Версии до 6.0 будут видеть файлы UTF-16 как двоичные и пропускать их, как в вашем примере.

person Erwin Waterlander    schedule 29.01.2013