Zainspirowany tym pytaniem , czy mogę użyć iconv
polecenia do wygenerowania wyjścia UTF-16 z BOM i określoną endianią?
iconv
Tekst nawróceni polecenie z jednego kodowania do innego.
Na przykład:
echo hello | iconv -f ascii -t utf-16
generuje reprezentację UTF-16 dla "hello\n"
.
Pliki UTF-16 często, ale nie zawsze, zaczynają się od znaku Byte Order Mark (BOM), który jest 2-bajtowym kodowaniem znaku Unicode U+FEFF
. Możesz określić endianowość pliku UTF-16 z BOM, sprawdzając, czy pierwsze dwa bajty to FE FF
lub FF FE
.
iconv
Komenda ma kilka opcji do generowania UTF-16 dane wyjściowe:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
To polecenie:
echo hello | iconv -f ascii -t utf-16be
generuje big-endian UTF-16 bez BOM ; wydaje się zakładać, że jeśli określono endianness, nie trzeba wskazywać go w danych wyjściowych. Podobnie, utf-16le
generuje little-endian UTF-16 bez BOM.
To:
echo hello | iconv -f ascii -t utf-16
generuje (w moim systemie x86 Ubuntu) little-endian UTF-16 z BOM - ale widziałem raport o podobnym poleceniu generującym big-endian UTF-16 z BOM, nawet w systemie little-endian.
Zawsze mogę ręcznie użyć BOM utf-16be
lub utf-16le
uzupełnić go, ale szukam rozwiązania, które po prostu używa iconv
polecenia.
Innym obejściem, jeśli wiesz, co -t utf-16
powoduje endianizm , jest:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
Co ja lubię do użytku jest coś takiego:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
ale iconv
tego nie obsługuje.
EDYTOWAĆ :
Czy ktoś mający dostęp do systemu Mac OSX x86 może opublikować komentarz pokazujący (skopiuj i wklej) dane wyjściowe następującego polecenia?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- i zastanawiam się, dlaczego -t utf-16
wydaje się, że endianness nie jest określony.
iconv -f UTF-8 -t UTF-16
, uruchom na systemie little-endian (MacOS), generując big-endian UTF-16 z BOM, co wydaje się bardzo dziwne.