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 как двоичные и пропускать их, как в вашем примере.