ฉันกำลังบีบอัดไฟล์ JavaScript และคอมเพรสเซอร์บ่นว่าไฟล์ของฉันมี
อักขระอยู่ในนั้น
ฉันจะค้นหาอักขระเหล่านี้และลบออกได้อย่างไร
ฉันกำลังบีบอัดไฟล์ JavaScript และคอมเพรสเซอร์บ่นว่าไฟล์ของฉันมี
อักขระอยู่ในนั้น
ฉันจะค้นหาอักขระเหล่านี้และลบออกได้อย่างไร
U+FEFF
คือจุดรหัส Unicode ที่ใช้สำหรับ BOM แต่ BOM นั้นเป็นวิธีที่เข้ารหัสจุดรหัส (UTF-8 0xEF 0xBB 0xBF
:, UTF-16LE:, 0xFF 0xFE
UTF-16BE: 0xFE 0xFF
ฯลฯ ) ดังนั้นไฟล์ที่เป็นปัญหาจึงถูกเข้ารหัส UTF-8 ซึ่งคอมเพรสเซอร์ตรวจพบเมื่อถอดรหัสเป็น Unicode codepoints จริง
คำตอบ:
perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js
ฉันคิดว่าเครื่องมือจะพังหากคุณมี utf-8 อื่น ๆ ในไฟล์ของคุณ แต่ถ้าไม่เป็นเช่นนั้นวิธีแก้ปัญหานี้อาจช่วยคุณได้ (ยังไม่ทดสอบ ... )
แก้ไข : เพิ่ม-CSD
ตัวเลือกตามความคิดเห็นของ tchrist
-CSD
สวิตช์หรือด้วยการPERL_UNICODE
ตั้งค่าที่น่าอิจฉาเพื่อSD
ให้ใช้งานได้
perl -CSD -pe 's/^\x{feff}//' file.csv
สังเกตการเปลี่ยนแปลงจาก <fffe> เป็น <feff>
คุณสามารถลบออกได้อย่างง่ายดายโดยใช้กลุ่มโดยมีขั้นตอนดังนี้:
1) ในเทอร์มินัลของคุณเปิดไฟล์โดยใช้กลุ่ม:
vim file_name
2) ลบอักขระBOMทั้งหมด:
:set nobomb
3) บันทึกไฟล์:
:wq
อีกวิธีหนึ่งในการลบอักขระเหล่านั้น - โดยใช้Vim :
เป็นกลุ่ม -b fileName
ตอนนี้อักขระที่ "ซ่อน" เหล่านั้นสามารถมองเห็นได้ ( <feff>
) และสามารถลบออกได้
ขอขอบคุณสำหรับคำตอบก่อนหน้านี่คือตัวแปร sed (1) ในกรณี:
sed '1s/^\xEF\xBB\xBF//'
บน 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 แบบสแตนด์อโลนซึ่งมีไว้สำหรับเรียกใช้จากบรรทัดคำสั่ง
$'\xEF\xBB\xBF//'
เป็นคุณลักษณะ Bash ไม่ใช่เฉพาะคุณลักษณะ Mac หรือ OSX กับ contruct sed
นี้ทุบตีจะแยกลำดับหนีเข้าไปในไบต์ที่เกิดขึ้นจริงก่อนที่จะผ่านบรรทัดคำสั่งเพื่อ ขึ้นอยู่กับsed
ตัวแปรของคุณสิ่งนี้อาจใช้งานได้หรือไม่ก็ได้ (แม้ว่าฉันแน่ใจว่ามีประโยชน์สำหรับผู้ใช้ OSX ที่รู้ว่าควรใช้งานได้ทันทีสำหรับพวกเขา)
การใช้หางอาจง่ายกว่า:
tail --bytes=+4 filename > new_filename
วิธีแก้ปัญหาของ @ tripleee ไม่ได้ผลสำหรับฉัน แต่การเปลี่ยนการเข้ารหัสไฟล์เป็น ASCII และอีกครั้งเป็น UTF-8 ทำให้เคล็ดลับ :-)
ฉันเคยใช้ vimgrep สำหรับสิ่งนี้
:vim "[\uFEFF]" *
นอกจากนี้คำสั่งค้นหากลุ่มปกติ
/[\uFEFF]
คำสั่ง 'file' แสดงว่ามี BOM หรือไม่:
ตัวอย่างเช่น 'file myfile.xml' จะแสดงข้อความ: "XML 1.0 document, UTF-8 Unicode (with BOM), with very long lines with CRLF line terminators"
dos2unix จะลบ BOM
ใน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
ผมขอแนะนำให้ใช้ "dos2unix" dos2unix ./thefile.js
เครื่องมือโปรดทดสอบเพื่อการทำงาน
หากจำเป็นให้ลองใช้สิ่งนี้กับหลายไฟล์:
for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done
ขอแสดงความนับถือ
bomstrip
ไม่สามารถใช้งานได้ง่ายบนเครื่อง Mac ของฉันดังนั้นโปรดสละเวลาในการให้เวอร์ชันง่ายๆแก่คุณ:find . -type f -exec dos2unix '{}' +
บันทึกไฟล์โดยไม่มีลายเซ็นรหัส
<U+FEFF>
นั่นคือ<0xEF,0xBB,0xBF>
BOM ของไฟล์ UTF8 ดังนั้นคุณควรเปลี่ยนชื่อเรื่อง คุณต้องการลบออกอย่างไร โดยนางฟ้าวิเศษ? โดยเครื่องมือบรรทัดคำสั่ง? โดยแก้ไขทีละคน? Notepad ++ สามารถเปลี่ยนการเข้ารหัสเป็น UTF8 โดยไม่มี BOM ตัวอย่างเช่น googling 5 วินาทีของ "strip BOM utf8" ฉันพบสิ่งนี้สำหรับ Linux: ueber.net/who/mjl/projects/bomstrip