<0xEF, 0xBB, 0xBF> อักขระที่แสดงในไฟล์ จะลบออกได้อย่างไร?


87

ฉันกำลังบีบอัดไฟล์ JavaScript และคอมเพรสเซอร์บ่นว่าไฟล์ของฉันมีอักขระอยู่ในนั้น

ฉันจะค้นหาอักขระเหล่านี้และลบออกได้อย่างไร


16
นั่นไม่ใช่<U+FEFF>นั่นคือ<0xEF,0xBB,0xBF>BOM ของไฟล์ UTF8 ดังนั้นคุณควรเปลี่ยนชื่อเรื่อง คุณต้องการลบออกอย่างไร โดยนางฟ้าวิเศษ? โดยเครื่องมือบรรทัดคำสั่ง? โดยแก้ไขทีละคน? Notepad ++ สามารถเปลี่ยนการเข้ารหัสเป็น UTF8 โดยไม่มี BOM ตัวอย่างเช่น googling 5 วินาทีของ "strip BOM utf8" ฉันพบสิ่งนี้สำหรับ Linux: ueber.net/who/mjl/projects/bomstrip
xanatos

1
อาจช่วยให้คุณได้รับคำตอบที่เกี่ยวข้องกับปัญหาของคุณโดยเฉพาะหากคุณบอกเราว่าคุณใช้เครื่องมือจาวาสคริปต์อะไรในการบีบอัดบนแพลตฟอร์มใดและเครื่องมืออื่นใดที่เป็นส่วนหนึ่งของกระบวนการสร้างของคุณ
SingleNegationElimination

15
BOMs ใน UTF-8 เป็น crud ที่แน่นอน คุณต้องหาผู้สร้างไฟล์นั้นและบอกให้ตัด @ # %% ออก
tchrist

4
@peterflynn: U+FEFFคือจุดรหัส Unicode ที่ใช้สำหรับ BOM แต่ BOM นั้นเป็นวิธีที่เข้ารหัสจุดรหัส (UTF-8 0xEF 0xBB 0xBF:, UTF-16LE:, 0xFF 0xFEUTF-16BE: 0xFE 0xFFฯลฯ ) ดังนั้นไฟล์ที่เป็นปัญหาจึงถูกเข้ารหัส UTF-8 ซึ่งคอมเพรสเซอร์ตรวจพบเมื่อถอดรหัสเป็น Unicode codepoints จริง
Remy Lebeau

4
@xanatos ไม่ว่าจะเป็นอย่างไรนี่คือสิ่งที่ปรากฏและนั่นคือวิธีที่ผู้คนสามารถค้นหาคำถามนี้ได้อย่างง่ายดายโดยใช้เครื่องมือค้นหา
BartoszKP

คำตอบ:


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

ฉันคิดว่าเครื่องมือจะพังหากคุณมี utf-8 อื่น ๆ ในไฟล์ของคุณ แต่ถ้าไม่เป็นเช่นนั้นวิธีแก้ปัญหานี้อาจช่วยคุณได้ (ยังไม่ทดสอบ ... )

แก้ไข : เพิ่ม-CSDตัวเลือกตามความคิดเห็นของ tchrist


1
คุณต้องเรียกใช้ด้วย-CSDสวิตช์หรือด้วยการPERL_UNICODEตั้งค่าที่น่าอิจฉาเพื่อSDให้ใช้งานได้
tchrist

Regexp ทำงานได้ดีสำหรับการลบอักขระ <fffe> ที่จุดเริ่มต้นของบรรทัดเพื่อแทนที่อักขระ <fffe> ทั้งหมดในบรรทัด: 's / \ x {fffe} // g'
Diego Pino

2
ใน Mac OSX ฉันต้องเปลี่ยนเป็น: perl -CSD -pe 's/^\x{feff}//' file.csvสังเกตการเปลี่ยนแปลงจาก <fffe> เป็น <feff>
mpettis

1
@mpettis นั่นไม่ใช่ BOM แต่เป็น BOM ที่มีการย้อนกลับของไบต์ อาจเกิดขึ้นบนแพลตฟอร์มใดก็ได้หากคุณแปลง UTF-16 เป็น UTF-8 และได้รับไบต์ออเดอร์ผิด (แม้ว่าวัตถุประสงค์ของ BOM คือการป้องกันข้อผิดพลาดนั้น
ก็ตาม

1
@blong แล้วไง? ถามคำถามแยกกันถ้าคุณคิดไม่ออก (แต่อาจถูกทำเครื่องหมายว่าซ้ำกันครั้งแรก google hit stackoverflow.com/questions/1712188/… )
tripleee

188

คุณสามารถลบออกได้อย่างง่ายดายโดยใช้กลุ่มโดยมีขั้นตอนดังนี้:

1) ในเทอร์มินัลของคุณเปิดไฟล์โดยใช้กลุ่ม:

vim file_name

2) ลบอักขระBOMทั้งหมด:

:set nobomb

3) บันทึกไฟล์:

:wq

วิธีนี้ใช้ได้ผลสำหรับฉัน มันง่ายกว่าคำตอบที่เลือก ขอบคุณ
szydan

ฉันใช้วิธีแก้ปัญหาที่ยอดเยี่ยมนี้แม้ว่าปกติฉันจะเป็นพรรคพวกของอีแมคก็ตาม vim ftw
Ellen Spertus

31

อีกวิธีหนึ่งในการลบอักขระเหล่านั้น - โดยใช้Vim :

เป็นกลุ่ม -b fileName

ตอนนี้อักขระที่ "ซ่อน" เหล่านั้นสามารถมองเห็นได้ ( <feff>) และสามารถลบออกได้


20

ขอขอบคุณสำหรับคำตอบก่อนหน้านี่คือตัวแปร sed (1) ในกรณี:

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

1
แหล่งข้อมูลอื่นแนะนำให้นำรูปที่ 1 ไปไว้ข้างหน้ารูปแบบเช่นใน "sed '1 s / \ xEF \ xBB \ xBF //'" เพื่อให้ตรงกับบรรทัดแรกเท่านั้น อย่างไรก็ตามสำหรับฉันใน Mac OS X ทั้งสองวิธีไม่ได้ผล
Marian

1
วิธีนี้ได้ผลและเป็นทางออกที่ดีที่สุดสำหรับฉัน ขอบคุณครับ!
Vance Lucas

1
ชอบโซลูชันนี้ ใช้งานง่ายที่สุดและยังปรับขนาดได้ ... :)
Piko

1
@Marian สายไปหน่อย แต่คุณสามารถตรวจสอบคำตอบของ Masumที่แสดงให้เห็นว่าเหตุใดจึงไม่ทำงานบน mac
ยังมีคนใช้ MS-DOS

1
เพิ่ม -i to sed เพื่ออัปเดตไฟล์ที่มีการเปลี่ยนแปลง
โยฮัน

17

บน Unix / Linux:

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

บน MacOSX

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

สังเกต $ after sed สำหรับ mac

บน Windows

มีSuper Sedเป็นรุ่นปรับปรุงของ sed สำหรับ Windows นี่คือ. exe แบบสแตนด์อโลนซึ่งมีไว้สำหรับเรียกใช้จากบรรทัดคำสั่ง


1
"สังเกต $ หลัง sed สำหรับ mac" - ขอบคุณครับ!
ยังมีคนใช้ MS-DOS

1
สตริง Bash "C-style" $'\xEF\xBB\xBF//'เป็นคุณลักษณะ Bash ไม่ใช่เฉพาะคุณลักษณะ Mac หรือ OSX กับ contruct sedนี้ทุบตีจะแยกลำดับหนีเข้าไปในไบต์ที่เกิดขึ้นจริงก่อนที่จะผ่านบรรทัดคำสั่งเพื่อ ขึ้นอยู่กับsedตัวแปรของคุณสิ่งนี้อาจใช้งานได้หรือไม่ก็ได้ (แม้ว่าฉันแน่ใจว่ามีประโยชน์สำหรับผู้ใช้ OSX ที่รู้ว่าควรใช้งานได้ทันทีสำหรับพวกเขา)
tripleee

1
อาจจะ sed -i 's /.../.../'
Arthur

6

การใช้หางอาจง่ายกว่า:

tail --bytes=+4 filename > new_filename

1
เทคนิคนี้จะล้มเหลวหลังจากผู้สร้างไฟล์ลบ BOM ไม่สามารถปรับขนาดได้ ... :)
Piko

4

วิธีแก้ปัญหาของ @ tripleee ไม่ได้ผลสำหรับฉัน แต่การเปลี่ยนการเข้ารหัสไฟล์เป็น ASCII และอีกครั้งเป็น UTF-8 ทำให้เคล็ดลับ :-)


3

ฉันเคยใช้ vimgrep สำหรับสิ่งนี้

:vim "[\uFEFF]" *

นอกจากนี้คำสั่งค้นหากลุ่มปกติ

/[\uFEFF]

2

คำสั่ง 'file' แสดงว่ามี BOM หรือไม่:

ตัวอย่างเช่น 'file myfile.xml' จะแสดงข้อความ: "XML 1.0 document, UTF-8 Unicode (with BOM), with very long lines with CRLF line terminators"

dos2unix จะลบ BOM



1

ในSublime Textคุณสามารถติดตั้งแพ็คเกจ Highlighterจากนั้นปรับแต่งนิพจน์ทั่วไปในการตั้งค่าผู้ใช้ของคุณ

ที่นี่ฉันเพิ่ม\uFEFFไว้ที่ส่วนท้ายของhighlighter_regexคุณสมบัติ

{
    "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
}

ในการเขียนทับการตั้งค่าแพ็คเกจเริ่มต้นให้วางไฟล์ที่นี่:

~ / .config / sublime-text-3 / แพ็คเกจ / ผู้ใช้ / highlighter.sublime-settings


1

ผมขอแนะนำให้ใช้ "dos2unix" dos2unix ./thefile.jsเครื่องมือโปรดทดสอบเพื่อการทำงาน

หากจำเป็นให้ลองใช้สิ่งนี้กับหลายไฟล์:

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

ขอแสดงความนับถือ


1
ฉันชอบคำตอบของคุณ - bomstripไม่สามารถใช้งานได้ง่ายบนเครื่อง Mac ของฉันดังนั้นโปรดสละเวลาในการให้เวอร์ชันง่ายๆแก่คุณ:find . -type f -exec dos2unix '{}' +
dsz

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.