ได้รับแรงบันดาลใจจากคำถามนี้ฉันสามารถใช้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 FFFF 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 ซึ่งดูเหมือนว่าแปลกมาก