Ký tự <0xEF, 0xBB, 0xBF> hiển thị trong tệp. Làm thế nào để loại bỏ chúng?


86

Tôi đang nén các tệp JavaScript và máy nén phàn nàn rằng các tệp của tôi có ký tự trong đó.

Làm cách nào tôi có thể tìm kiếm những ký tự này và xóa chúng?


16
Đó không phải là <U+FEFF>, đó là <0xEF,0xBB,0xBF>BOM của tệp UTF8, vì vậy bạn nên thay đổi tiêu đề. Bạn muốn xóa chúng như thế nào? Bằng thần tiên? Bằng công cụ dòng lệnh? Bằng cách chỉnh sửa từng cái một? Notepad ++ có thể thay đổi mã hóa thành UTF8 mà không cần BOM. Ví dụ: chỉ cần googling 5 giây "dải BOM utf8", tôi đã tìm thấy nó cho Linux: ueber.net/who/mjl/projects/bomstrip
xanatos

1
Nó có thể giúp bạn nhận được câu trả lời liên quan cụ thể đến vấn đề của bạn nếu bạn cho chúng tôi biết bạn đang sử dụng công cụ javascript nào để nén, trên nền tảng nào và những công cụ nào khác là một phần trong quá trình xây dựng của bạn.
SingleNegationElimination

15
BOM trong UTF-8 là tuyệt đối thô thiển. Bạn cần tìm nhà sản xuất của tệp đó và yêu cầu họ cắt nó ra khỏi @ # %%.
tchrist

4
@peterflynn: U+FEFFlà điểm mã Unicode được sử dụng cho BOM, nhưng bản thân BOM là cách điểm mã đó được mã hóa (UTF-8 0xEF 0xBB 0xBF:, UTF-16LE:, 0xFF 0xFEUTF-16BE:, 0xFE 0xFFv.v.). Vì vậy, các tệp được đề cập đến được mã hóa UTF-8, mà máy nén sẽ phát hiện khi giải mã chúng thành mã điểm Unicode thực tế.
Remy Lebeau

4
@xanatos Bất kể nó là gì, đây là cách nó biểu hiện và đó là cách mọi người có thể dễ dàng tìm thấy câu hỏi này bằng công cụ tìm kiếm.
BartoszKP

Câu trả lời:


18
perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js

Tôi cho rằng công cụ sẽ bị hỏng nếu bạn có utf-8 khác trong tệp của mình, nhưng nếu không, có lẽ giải pháp này có thể giúp bạn. (Chưa được kiểm tra ...)

Chỉnh sửa : đã thêm -CSDtùy chọn, theo nhận xét của tchrist.


1
Bạn cần chạy với công -CSDtắc hoặc với PERL_UNICODEenvariable được đặt thành SD, để điều đó hoạt động.
tchrist

Regexp hoạt động OK khi xóa ký tự <fffe> ở đầu dòng, để thay thế tất cả các ký tự <fffe> trong một dòng: 's / \ x {fffe} // g'.
Diego Pino

2
Trên Mac OSX, tôi phải thay đổi thành perl -CSD -pe 's/^\x{feff}//' file.csv:, lưu ý sự thay đổi từ <fffe> thành <feff>.
mpettis

1
@mpettis Đó không phải là BOM, mà là BOM với các byte được đảo ngược. Nó có thể xảy ra trên nền tảng nào, nếu bạn chuyển đổi UTF-16 sang UTF-8 và nhận được sai byte-trật tự (mặc dù mục đích của BOM là để ngăn chặn lỗi mà!)
tripleee

1
@blong Còn nó thì sao? Đặt một câu hỏi riêng biệt nếu bạn không thể tìm nó ra (nhưng có lẽ nó sẽ được đánh dấu như là một bản sao; đầu tiên google hit stackoverflow.com/questions/1712188/... )
tripleee

185

Bạn có thể dễ dàng loại bỏ chúng bằng vim , sau đây là các bước:

1) Trong thiết bị đầu cuối của bạn, mở tệp bằng vim:

vim file_name

2) Xóa tất cả các ký tự BOM :

:set nobomb

3) Lưu tệp:

:wq

Giải pháp này đã làm việc cho tôi. Nó đơn giản hơn câu trả lời đã chọn. Cảm ơn
szydan

Tôi đã sử dụng giải pháp tuyệt vời này mặc dù tôi thường là một đảng viên của emacs. Vim ftw
Ellen Spertus

30

Một phương pháp khác để xóa các ký tự đó - sử dụng Vim :

vim -b fileName

Bây giờ các ký tự "ẩn" đó hiển thị ( <feff>) và có thể bị xóa.


20

Cảm ơn vì những câu trả lời trước, đây là một biến thể sed (1) chỉ trong trường hợp:

sed '1s/^\xEF\xBB\xBF//'

1
Các nguồn khác đề xuất thêm hình 1 vào dấu đệm, như trong "sed '1 s / \ xEF \ xBB \ xBF //'", để chỉ khớp với dòng đầu tiên. Tuy nhiên, đối với tôi trên Mac OS X, cả hai cách đều không hoạt động.
Marian

1
Điều này đã hiệu quả và là giải pháp tốt nhất cho tôi. Cảm ơn ngài!
Vance Lucas

1
Yêu thích giải pháp này. Dễ nhất để thực hiện và vẫn còn khả năng mở rộng ... :)
Piko

1
@Marian Hơi muộn, nhưng bạn có thể kiểm tra câu trả lời của Masum cho biết lý do tại sao nó không hoạt động trên mac.
Ai đó vẫn sử dụng bạn MS-DOS

1
Thêm -i vào sed để cập nhật (các) tệp với các thay đổi.
Johan

17

Trên Unix / Linux:

sed 's/\xEF\xBB\xBF//' < inputfile > outputfile

Trên MacOSX

sed $'s/\xEF\xBB\xBF//' < inputfile > outputfile

Lưu ý $ sau sed cho mac.

Trên Windows

Super Sed một phiên bản nâng cao của sed. Đối với Windows, đây là một .exe độc ​​lập, dành để chạy từ dòng lệnh.


1
"Lưu ý $ sau sed cho mac." - Cảm ơn ngài!
Ai đó vẫn sử dụng bạn MS-DOS

1
Chuỗi Bash "C-style" $'\xEF\xBB\xBF//'là một tính năng của Bash, không đặc biệt là tính năng của Mac hoặc OSX. Với cấu trúc này, Bash sẽ phân tích cú pháp các chuỗi thoát thành các byte thực tế trước khi chuyển dòng lệnh tới sed. Tùy thuộc vào sedbiến thể của bạn , điều này có thể hoạt động hoặc có thể không hoạt động (mặc dù tôi chắc chắn rằng nó hữu ích cho người dùng OSX khi biết rằng nó sẽ hoạt động hiệu quả cho họ).
tripleee

1
có thể sed -i 's /.../.../'
Arthur

6

Sử dụng đuôi có thể dễ dàng hơn:

tail --bytes=+4 filename > new_filename

1
Kỹ thuật này sẽ thất bại sau khi nhà sản xuất tệp xóa BOM. Không thể mở rộng ... :)
Piko

4

Giải pháp của @ tripleee không phù hợp với tôi. Nhưng thay đổi mã hóa tệp thành ASCII và một lần nữa thành UTF-8 đã thực hiện thủ thuật :-)


3

Tôi đã sử dụng vimgrep cho việc này

:vim "[\uFEFF]" *

cũng là lệnh tìm kiếm vim bình thường

/[\uFEFF]

2

Lệnh 'tệp' hiển thị nếu BOM có mặt:

Ví dụ: 'file myfile.xml' hiển thị: "Tài liệu XML 1.0, văn bản UTF-8 Unicode (với BOM), với các dòng rất dài, có dấu cuối dòng CRLF"

dos2unix sẽ xóa BOM.



1

Trong Sublime Text, bạn có thể cài đặt gói Highlighter và sau đó tùy chỉnh cụm từ thông dụng trong cài đặt người dùng của mình.

Ở đây tôi đã thêm vào \uFEFFcuối highlighter_regextài sản.

{
    "highlighter_enabled": true,
    "highlighter_regex": "(\t+ +)|( +\t+)|[\u2026\u2018\u2019\u201c\u201d\u2013\u2014\uFEFF]|[\t ]+$",
    "highlighter_scope_name": "invalid",
    "highlighter_max_file_size": 1048576,
    "highlighter_delay": 3000
}

Để ghi đè cài đặt gói mặc định, hãy đặt tệp ở đây:

~ / .config / sublime-text-3 / Packages / User / highlighter.sublime-settings


1

Tôi khuyên bạn nên sử dụng công cụ "dos2unix", vui lòng kiểm tra để chạy dos2unix ./thefile.js.

Nếu cần, hãy thử sử dụng một cái gì đó như thế này cho nhiều tệp:

for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done

Trân trọng.


1
Tôi thích câu trả lời của bạn - bomstripkhông dễ dàng có sẵn trên máy Mac của tôi - vì vậy hãy dành thời gian để cung cấp cho bạn phiên bản đơn giản:find . -type f -exec dos2unix '{}' +
dsz Ngà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.