Xử lý tệp bắt đầu bằng BOM (FF FE)


10

Tôi đã nhận được tệp .csv với 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.|

Khi sử dụng awkđể phân tích cú pháp, tôi nhận được một loạt các byte rỗng, điều mà tôi nghi ngờ là do thứ tự byte. Làm cách nào tôi có thể trao đổi thứ tự byte trên tệp này (sử dụng CLI) để các công cụ bình thường sẽ hoạt động với nó?

Lưu ý rằng tôi nghĩ rằng tệp này chỉ là các ký tự ASCII (ngoại trừ BOM), nhưng tôi không thể xác nhận rằng vì grepcho rằng đó là tệp nhị phân:

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

Tìm kiếm cùng một chuỗi trong VIM hiển thị mọi ký tự khớp!

Sử dụng iconvđể chuyển đổi sang ASCII không loại bỏ các giá trị \ x00, thực sự nó làm cho vấn đề trở nên tồi tệ hơn vì bây giờ chúng trông giống như các byte rỗng thay vì 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.|

Làm cách nào tôi có thể trao đổi thứ tự byte trên tệp này (sử dụng CLI) để các công cụ bình thường sẽ hoạt động với nó?


Tệp CSV bạn đã tạo trong Windows hoặc Mac?
cuonglm

Bạn có thể cho một phần của tập tin?
cuonglm

Đây là một liên kết đến một phần ẩn danh của tập tin bảo tồn các vấn đề duy nhất với nó. Cảm ơn bạn!
dotancohen

Câu trả lời:


15

Từ bài viết wikipedia này , FF FEcó nghĩa UTF16LE. Vì vậy, bạn nên nói iconvđể chuyển đổi từ UTF16LEsang UTF8:

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

Hoàn hảo, cảm ơn bạn! Tôi đã trộn lẫn BOM UTF-8 và UTF-16: Tôi nghĩ rằng FFFE và FEFF là UTF-8 và tôi chưa bao giờ biết BOM UTF-16. Trên thực tế, đó là những BOM UTF-16 và tôi chưa bao giờ biết BOM UTF-8 (vô dụng)!.
dotancohen

@dotancohen: Tôi thử nghiệm trong Fedora của tôi và tailgiải pháp hoạt động tốt. Bạn sử dụng hệ điều hành nào?
cuonglm

Điều này không hoạt động (tức là loại bỏ BOM) cho phiên bản "iconv (GNU libiconv 1.14)" trong Git Bash trên Windows. Nhưng (vì lý do gì) chỉ sử dụng UTF-16thay vì một trong các phiên bản thứ tự byte hoạt động.
Kenny Evitt

3

dos2unix cũng loại bỏ các BOM và chuyển đổi UTF-16 thành 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 cũng loại bỏ các UTF-8 BOM:

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

0

Cũng đã trả lời trên StackOverflow: Làm cách nào tôi có thể xóa BOM khỏi tệp UTF-8? @rici có một câu trả lời hay.

Câu trả lời ngắn:

  • Câu trả lời ngắn : sed -i $'1s/^\uFEFF//' file.txt, nhưng không phải trên BSD hoặc OS / X.
  • Câu trả lời khác: vi file.txt, :set nobomb, :w, đơn giản nhưng thủ công
  • Cài đặt dos2unuix; dos2unix -r file.txt
  • Các dấu này có một số ý nghĩa có thể, bao gồm cả tệp là UTF-8; xem bài viết Wikipedia .
  • Các chương trình Windows thích thêm các dấu này. Hầu hết các biên tập viên sẽ không loại bỏ các dấu hiệu này.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.