echo "string" > file в 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, и это не может быть изменено.

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 символы

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

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

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

Get-HexDump file.txt

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

Get-HexDump file.txt -width 15 -bytes 150

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

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

Другие вопросы по тегам