ประมวลผลไฟล์ที่ขึ้นต้นด้วย BOM (FF FE)


10

ฉันได้รับไฟล์. csv พร้อมFF FEBOM:

$ head -n1 dotan.csv | hd
00000000  ff fe 41 00 64 00 20 00  67 00 72 00 6f 00 75 00  |..A.d. .g.r.o.u.|

เมื่อใช้awkในการแยกมันฉันได้รับพวงไบต์ว่างซึ่งฉันสงสัยว่าเกิดจากการสั่งไบต์ ฉันจะสลับลำดับไบต์บนไฟล์นี้ (โดยใช้ CLI) เพื่อให้เครื่องมือปกติทำงานได้อย่างไร

โปรดทราบว่าฉันคิดว่าไฟล์นี้เป็นอักขระ ASCII เท่านั้น (ยกเว้น BOM) แต่ฉันไม่สามารถยืนยันได้อย่างที่grepคิดว่าเป็นไฟล์ไบนารี:

$ grep -P '^[\x00-\x7f]' dotan.csv 
Binary file dotan.csv matches

การค้นหาสตริงเดียวกันใน VIM แสดงการจับคู่อักขระทุกตัว !

การใช้iconvการแปลงเป็น ASCII ไม่ได้กำจัดค่า \ x00 จริงๆแล้วมันทำให้ปัญหาแย่ลงเพราะตอนนี้พวกเขาดูเหมือน null bytes แทน UTF-8!

$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt 
iconv: illegal input sequence at position 0

$ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt

$ head -n1 fixed.txt | hd
00000000  41 00 64 00 20 00 67 00  72 00 6f 00 75 00 70 00  |A.d. .g.r.o.u.p.|

ฉันจะสลับลำดับไบต์บนไฟล์นี้ (โดยใช้ CLI) เพื่อให้เครื่องมือปกติทำงานได้อย่างไร


ไฟล์ CSV ที่คุณสร้างใน Windows หรือ Mac?
cuonglm

คุณสามารถให้ส่วนของไฟล์ได้หรือไม่?
cuonglm

นี่คือลิงค์ไปยังส่วนที่ไม่ระบุชื่อของไฟล์ที่เก็บรักษาปัญหาเฉพาะไว้ ขอบคุณ!
dotancohen

คำตอบ:


16

จากนี้บทความวิกิพีเดีย , วิธีการFF FE UTF16LEดังนั้นคุณควรบอกiconvให้เปลี่ยนจากUTF16LEเป็นUTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt

สมบูรณ์แบบขอบคุณ! ฉันมี UTF-8 และ UTF-16 BOM ผสมกัน: ฉันคิดว่า FFFE และ FEFF เป็น UTF-8 และฉันไม่เคยรู้จัก UTF-16 BOM ที่จริงแล้วนั่นคือ UTF-16 BOMs และฉันไม่เคยรู้จัก UTF-8 BOM ที่ไร้ประโยชน์เลย!
dotancohen

@dotancohen: ฉันทดสอบใน Fedora ของฉันและtailวิธีแก้ปัญหาทำงานได้ดี ระบบปฏิบัติการใดที่คุณใช้
cuonglm

สิ่งนี้ใช้ไม่ได้ (เช่นลบ BOM) สำหรับรุ่น "iconv (GNU libiconv 1.14)" ใน Git Bash บน Windows แต่ (ด้วยเหตุผลอะไรก็ตาม) การใช้งานUTF-16แทนที่จะเป็นหนึ่งในเวอร์ชันไบต์สั่งซื้อ
Kenny Evitt

3

dos2unix ยังลบ BOM และแปลง UTF-16 เป็น UTF-8:

$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182

dos2unix ลบ UTF-8 BOMs ด้วย:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61

0

ตอบกลับไปยัง StackOverflow: ฉันจะลบ BOM ออกจากไฟล์ UTF-8 ได้อย่างไร @riciมีคำตอบที่ดี

คำตอบสั้น ๆ :

  • คำตอบสั้น ๆ : sed -i $'1s/^\uFEFF//' file.txtแต่ไม่ใช่ใน BSD หรือ OS / X
  • คำตอบอื่น: vi file.txt, :set nobomb, :w, ที่เรียบง่าย แต่คู่มือ
  • ติดตั้ง dos2unuix; dos2unix -r file.txt
  • เครื่องหมายเหล่านี้มีความหมายที่เป็นไปได้หลายประการรวมถึงไฟล์ที่เป็น UTF-8 ดูวิกิพีเดียบทความ
  • โปรแกรม Windows ชอบที่จะเพิ่มเครื่องหมายเหล่านี้ ผู้แก้ไขส่วนใหญ่จะไม่ลบเครื่องหมายเหล่านี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.