ได้รับแรงบันดาลใจจากคำถามนี้ฉันสามารถใช้iconv
คำสั่งเพื่อสร้างเอาต์พุต UTF-16 ด้วย BOM และด้วย endianness ที่ระบุได้หรือไม่
iconv
ข้อความคำสั่งแปลงจากการเข้ารหัสหนึ่งไปยังอีก
ตัวอย่างเช่น:
echo hello | iconv -f ascii -t utf-16
สร้าง UTF-16 "hello\n"
เป็นตัวแทนของ
UTF-16 ไฟล์บ่อย แต่ไม่เคยเริ่มต้นด้วยการสั่งซื้อมาร์คไบต์ (BOM) ซึ่งเป็นการเข้ารหัส 2 U+FEFF
ไบต์ของอักขระ คุณสามารถกำหนด endianness ของไฟล์ 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
สร้าง big-UTF-16 ไม่มี BOM ; ดูเหมือนว่าจะถือว่าถ้าคุณระบุ endianness คุณไม่จำเป็นต้องระบุในเอาท์พุท ในทำนองเดียวกันutf-16le
สร้าง UTF-16 แบบ little-endian ที่ไม่มี BOM
นี้:
echo hello | iconv -f ascii -t utf-16
สร้าง (บนระบบ x86 Ubuntu ของฉัน) little-endian UTF-16 พร้อม BOM - แต่ฉันเคยเห็นรายงานของคำสั่งที่คล้ายกันที่สร้าง big-endian UTF-16 ที่มี BOM แม้แต่ในระบบ end-little
ฉันสามารถใช้utf-16be
หรือutf-16le
เพิ่ม BOM ล่วงหน้าได้ด้วยตนเอง แต่ฉันกำลังมองหาโซลูชันที่เพิ่งใช้iconv
คำสั่ง
วิธีแก้ปัญหาอื่นถ้าคุณรู้ว่า endianness -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
ไม่สนับสนุนสิ่งนั้น
แก้ไข:
ใครบางคนที่สามารถเข้าถึงระบบ x86 Mac OSX สามารถโพสต์ความคิดเห็นที่แสดงผลลัพธ์ (คัดลอกและวาง) ของคำสั่งต่อไปนี้ได้หรือไม่?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- และสงสัยว่าทำไม-t utf-16
ดูเหมือนว่าจะปล่อยให้ endianness ไม่ได้ระบุ
iconv -f UTF-8 -t UTF-16
ทำงานในระบบเล็ก ๆ น้อย ๆ (MacOS) ซึ่งสร้าง UTF-16 ขนาดใหญ่ที่มี BOM ซึ่งดูเหมือนว่าแปลกมาก