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.Odpowiedzi:
Nie , jeśli podasz kolejność bajtów,
iconv
nie wstawi BOM.To pochodzi z Konsorcjum Unicode
(mój nacisk)
Oczekuję, że
iconv
stara się być wierny ostatnim z tych wytycznych.Aktualizacja.
Dygresja
W mojej opinii:
Opcja określenia BOM byłaby z pewnością użyteczną dodatkową funkcją dla iconv.
Plik UTF-16LE bez BOM jest użyteczny w systemie Windows, choć czasem wymaga to dodatkowego wysiłku. Na przykład okno dialogowe Otwórz plik Notatnika pozwala wybrać „Unicode”, który jest nazwą Microsoftu dla „UTF-16LE” i (co nie jest zaskoczeniem) wydaje się działać na plikach bez BOM.
Mogę otworzyć plik testowy UTF-16LE (bez BOM) lub plik testowy UTF-8 (bez BOM) w Notatniku Windows (XP) w zwykły sposób, np. Poprzez dwukrotne kliknięcie nazwy pliku w Eksploratorze. Wydaje mi się to przydatne. Wiem, że czasami system Windows nieprawidłowo zgaduje kodowanie - w takim przypadku musisz powiedzieć Notatnikowi o kodowaniu podczas otwierania pliku. Ta niedogodność oznacza, że dołączanie BOM jest lepsze w przypadku plików tekstowych przeznaczonych do użycia w systemie Windows.
Jeśli konkretna aplikacja nie będzie działać z niczym innym niż plik UTF-16LE z BOM, to zgodziłbym się, że plik UTF-16LE bez BOM nie nadaje się do tej konkretnej aplikacji.
Podejrzewam, że jeśli możesz sprawić, by wszystko działało z UTF-8 (bez BOM), jest to najlepsze rozwiązanie w perspektywie długoterminowej.
Jednak odpowiedź na pytanie „ czy mogę użyć polecenia iconv do wygenerowania danych wyjściowych UTF-16 z BOM i przy określonej endianowości ” brzmi obecnie „ Nie ”.
źródło
.txt
- tak długo, jak plik ma BOM.C:\Windows\System32\reg.exe
eksport UTF-16 LE Z BOM i będzie tylko do odczytu UTF-16 LE Z BOM - nie będzie czytać UTF-16 LE bez BOM i nie będzie czytać UTF-16 BE z BOM - innymi słowy, wymaga BOM podczas czytania, ale do cholery lepiej być właściwym! (Na szczęście brzmi UTF-8.)