Вдохновленный этим вопросом , могу ли я использовать iconv
команду для генерации вывода UTF-16 с спецификацией и указанным порядком байтов?
Команда iconv
преобразует текст из одной кодировки в другую.
Например:
echo hello | iconv -f ascii -t utf-16
генерирует UTF-16 представление "hello\n"
.
Файлы UTF-16 часто, но не всегда, начинаются с метки порядка байтов (BOM), которая представляет собой 2-байтовую кодировку символа Unicode U+FEFF
. Вы можете определить порядковый номер файла UTF-16 с BOM, проверив, являются ли первые два байта FE FF
или FF FE
.
Команда iconv
имеет несколько опций для генерации вывода UTF-16:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
Эта команда:
echo hello | iconv -f ascii -t utf-16be
генерирует UTF-16 с прямым порядком байтов без спецификации ; кажется, предполагается, что если вы указали порядковый номер, вам не нужно указывать его в выводе. Точно так же utf-16le
генерирует UTF-16 с прямым порядком байтов без спецификации.
Это:
echo hello | iconv -f ascii -t utf-16
генерирует (в моей системе x86 Ubuntu) UTF-16 с прямым порядком байтов с BOM - но я видел отчет о похожей команде, генерирующей UTF-16 с прямым порядком байтов с BOM, даже в системе с прямым порядком байтов.
Я всегда могу использовать utf-16be
или utf-16le
и предварительно добавить спецификацию вручную, но я ищу решение, которое просто использует iconv
команду.
Другой обходной путь, если вы знаете, что -t utf-16
порождает порядок байтов :
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
Я хотел бы использовать что-то вроде:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
но iconv
не поддерживает это.
РЕДАКТИРОВАТЬ :
Может ли кто-то, имеющий доступ к системе Mac OSX x86, опубликовать комментарий, показывающий (скопированный и вставленный) вывод следующей команды?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- и удивляясь, почему-t utf-16
кажется, что порядок байтов не указан.iconv -f UTF-8 -t UTF-16
, что в системе с прямым порядком байтов (MacOS) генерируется UTF-16 с прямым порядком байтов и спецификацией, что выглядит очень странно.Ответы:
Нет , если вы указываете порядок байтов,
iconv
спецификация не вставляется.Это из Консорциума Unicode
(мой акцент)
Я ожидаю, что
iconv
пытается быть верным последнему из этих руководящих принципов.Обновить.
Отступление
По моему мнению:
Возможность указать спецификацию, безусловно, будет полезной дополнительной функцией для iconv.
Файл UTF-16LE без BOM является полезным в Windows, хотя и с дополнительными усилиями иногда. Например, диалоговое окно «Открыть файл» в блокноте позволяет выбрать «Unicode», который является именем Microsoft для «UTF-16LE» и (что неудивительно) работает с файлами без спецификации.
Я могу открыть тестовый файл UTF-16LE (без BOM) или тестовый файл UTF-8 (без BOM) в Windows Notepad (XP) обычным способом, например, дважды щелкнув имя файла в проводнике. Это кажется полезным для меня. Я знаю, что иногда Windows будет неправильно угадывать кодировку - в этом случае вы должны указать Notepad кодировку при открытии файла. Это неудобство означает, что включение спецификации предпочтительнее для текстовых файлов, предназначенных для использования в Windows.
Если конкретное приложение не будет работать ни с чем, кроме файла UTF-16LE с спецификацией, то я согласен, что файл UTF-16LE без спецификации не может использоваться для этого конкретного приложения.
Я подозреваю, что если вы можете заставить все работать с UTF-8 (без спецификации), это лучшее решение в долгосрочной перспективе.
Однако ответ на вопрос « могу ли я использовать команду iconv для генерации вывода UTF-16 с спецификацией и указанным порядком байтов » в настоящее время « Нет ».
источник
.txt
в файле есть спецификация.C:\Windows\System32\reg.exe
экспортирует UTF-16 LE с спецификацией и будет читать только UTF-16 LE с спецификацией - не будет читать UTF-16 LE без спецификации и не будет читать UTF-16 BE с спецификацией - Другими словами, он требует спецификации при чтении, но, черт побери, лучше быть правильным! (К счастью, это читается как UTF-8.)