Terinspirasi oleh pertanyaan ini , dapatkah saya menggunakan iconv
perintah untuk menghasilkan output UTF-16 dengan BOM dan dengan endianness yang ditentukan?
The iconv
perintah bertobat teks dari satu pengkodean ke yang lain.
Sebagai contoh:
echo hello | iconv -f ascii -t utf-16
menghasilkan representasi UTF-16 dari "hello\n"
.
File UTF-16 sering, tetapi tidak selalu, mulai dengan Byte Order Mark (BOM), yang merupakan pengodean 2-byte dari karakter Unicode U+FEFF
. Anda dapat menentukan endianness file UTF-16 dengan BOM dengan memeriksa apakah dua byte pertama adalah FE FF
atau FF FE
.
The iconv
perintah memiliki beberapa pilihan untuk menghasilkan UTF-16 keluaran:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
Perintah ini:
echo hello | iconv -f ascii -t utf-16be
menghasilkan big-endian UTF-16 tanpa BOM ; tampaknya menganggap bahwa jika Anda menentukan endianness, Anda tidak perlu menunjukkannya dalam output. Demikian pula, utf-16le
menghasilkan little-endian UTF-16 tanpa BOM.
Ini:
echo hello | iconv -f ascii -t utf-16
menghasilkan (pada sistem x86 Ubuntu saya) little-endian UTF-16 dengan BOM - tetapi saya telah melihat laporan dari perintah yang sama yang menghasilkan big-endian UTF-16 dengan BOM, bahkan pada sistem little-endian.
Saya selalu dapat menggunakan utf-16be
atau utf-16le
dan menambahkan BOM secara manual, tetapi saya sedang mencari solusi yang hanya menggunakan iconv
perintah.
Solusi lain, jika Anda tahu apa yang -t utf-16
dihasilkan endianness , adalah:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
Apa yang saya ingin seperti penggunaan adalah sesuatu seperti:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
tetapi iconv
tidak mendukung itu.
EDIT:
Dapatkah seseorang dengan akses ke sistem Mac OSX x86 memposting komentar yang menunjukkan (copy-and-paste) output dari perintah berikut?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- dan bertanya-tanya mengapa-t utf-16
tampaknya meninggalkan endianness tidak ditentukan.iconv -f UTF-8 -t UTF-16
, dijalankan pada sistem little-endian (MacOS), menghasilkan UTF-16 big-endian dengan BOM, yang tampaknya sangat aneh.Jawaban:
Tidak , jika Anda menentukan pemesanan byte,
iconv
tidak memasukkan BOM.Ini dari The Unicode Consortium
(penekanan saya)
Saya berharap
iconv
berusaha setia pada yang terakhir dari pedoman ini.Memperbarui.
Penyimpangan
Menurutku:
Opsi untuk menentukan BOM tentu akan menjadi fitur tambahan yang berguna untuk ikonv.
Sebuah file UTF-16LE tanpa BOM adalah dapat digunakan di Windows, meskipun dengan upaya tambahan kadang-kadang. Misalnya, dialog Buka File Notepad memungkinkan Anda untuk memilih "Unicode" yang merupakan nama Microsoft untuk "UTF-16LE" dan (tidak mengejutkan) tampaknya berfungsi pada file tanpa BOM.
Saya dapat membuka file uji UTF-16LE (tanpa BOM) atau file uji UTF-8 (tanpa BOM) di Windows Notepad (XP) dengan cara biasa, misalnya dengan mengklik dua kali nama file di explorer. Bagi saya itu sepertinya bermanfaat. Saya sadar bahwa terkadang Windows akan menebak penyandian dengan salah - Dalam hal ini Anda harus memberi tahu Notepad penyandian saat membuka file. Ketidaknyamanan ini berarti termasuk BOM lebih disukai untuk file teks yang dimaksudkan untuk digunakan pada Windows.
Jika aplikasi tertentu tidak akan bekerja dengan apa pun selain file UTF-16LE dengan BOM, maka saya setuju bahwa file UTF-16LE tanpa BOM tidak dapat digunakan untuk aplikasi spesifik itu.
Saya menduga bahwa jika Anda dapat membuat semuanya berfungsi dengan UTF-8 (tanpa BOM), itu adalah solusi terbaik dalam jangka panjang.
Namun jawaban untuk pertanyaan " dapatkah saya menggunakan perintah iconv untuk menghasilkan keluaran UTF-16 dengan BOM dan dengan endianness yang ditentukan " saat ini " Tidak ".
sumber
.txt
- selama file tersebut memiliki BOM.C:\Windows\System32\reg.exe
mengekspor UTF-16 LE WITH BOM dan hanya akan membaca UTF-16 LE WITH BOM - tidak akan membaca UTF-16 LE tanpa BOM dan tidak akan membaca UTF-16 BE with BOM - dengan kata lain, itu menuntut BOM saat membaca tetapi sebaiknya itu yang benar! (Untungnya, terbaca UTF-8.)