<0xEF, 0xBB, 0xBF> वर्ण फाइलों में दिखाई दे रहे हैं। उन्हें कैसे हटाया जाए?


86

मैं जावास्क्रिप्ट फ़ाइलों की कंप्रेसिंग कर रहा हूं और कंप्रेसर शिकायत कर रहा है कि मेरी फाइलों में उनका चरित्र है।

मैं इन पात्रों को कैसे खोज सकता हूं और उन्हें हटा सकता हूं?


16
यह नहीं है <U+FEFF>, वह यह है <0xEF,0xBB,0xBF>कि UTF8 फ़ाइलों का BOM है, इसलिए आपको शीर्षक बदलना चाहिए। आप उन्हें कैसे निकालना चाहेंगे? जादू परियों द्वारा? कमांड लाइन टूल द्वारा? एक-एक का संपादन करके? नोटपैड ++ बिना BOM के UTF8 में एन्कोडिंग को बदल सकता है। उदाहरण के लिए, "स्ट्रिप बॉम
यूटी

1
यह आपको एक उत्तर प्राप्त करने में मदद कर सकता है जो विशेष रूप से आपकी समस्या से संबंधित है यदि आपने हमें बताया कि आप किस जावास्क्रिप्ट टूल का उपयोग कर रहे हैं, तो आप किस प्लेटफॉर्म पर संपीड़न का उपयोग कर रहे हैं, और अन्य उपकरण आपकी निर्माण प्रक्रिया का हिस्सा हैं।
सिंगलएनजेशन इलिमिनेशन

15
UTF-8 में BOMs पूर्ण क्रूड हैं। आपको उस फ़ाइल के निर्माता को खोजने की आवश्यकता है और उन्हें यह बताने के लिए कि इसे # # %% काटना है।
tchrist

4
@peterflynn: U+FEFFयूनिकोड कोडपॉइंट है जिसका उपयोग किसी BOM के लिए किया जाता है, लेकिन BOM खुद ही है कि कोडपॉइंट एन्कोडेड है (UTF-8:, 0xEF 0xBB 0xBFUTF-16LE:, 0xFF 0xFEUTF-16BE:, 0xFE 0xFFआदि)। तो विचाराधीन फाइलें UTF-8 एनकोडेड हैं, जो कि कंप्रेसर का पता लगा रहा है जब उन्हें वास्तविक यूनिकोड कोडपॉइंट्स को डिकोड किया जाता है।
रेमी लेबेउ

4
@xanatos चाहे जो भी हो, यह इसी तरह से प्रकट होता है, और यही कारण है कि लोग खोज इंजन का उपयोग करके आसानी से इस प्रश्न को पा सकते हैं।
बार्टोज़केपी

जवाबों:


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

मुझे लगता है कि अगर आपकी फाइल में अन्य utf-8 है तो टूल टूट जाएगा, लेकिन यदि नहीं, तो शायद यह वर्कअराउंड आपकी मदद कर सकता है। (अप्राप्त ...)

संपादित करें : -CSDविकल्प को tchrist की टिप्पणी के अनुसार जोड़ा गया ।


1
काम करने के लिए आपको -CSDस्विच के साथ , या PERL_UNICODEएनेवेलेबल सेट के साथ चलना होगा SD
tchrist 18:14

Regexp एक पंक्ति की शुरुआत में <fffe> वर्ण को हटाने के लिए ठीक काम करता है, एक पंक्ति में सभी <fffe> वर्णों को बदलने के लिए: 's / \ x {fffe} // g'।
डिएगो पिनो

2
मैक OSX पर, मुझे इसे बदलना था: perl -CSD -pe 's/^\x{feff}//' file.csv<fffe> से <feff> तक के बदलाव पर ध्यान दें।
3

1
@mpettis यह BOM नहीं है, लेकिन बाइट्स वाला BOM उलट है। यह किसी भी प्लेटफ़ॉर्म पर हो सकता है, यदि आप UTF-16 को UTF-8 में बदल देते हैं और बाइट-ऑर्डर गलत हो जाता है (भले ही BOM का उद्देश्य उस त्रुटि को रोकना है!)
tripleee

1
@blong इसके बारे में क्या? एक अलग प्रश्न पूछें यदि आप इसका पता नहीं लगा सकते हैं (लेकिन संभवतः इसे एक डुप्लिकेट के रूप में चिह्नित किया जाएगा; पहला Google हिट stackoverflow.com/questions/1712188/… )
tripleee

185

आप आसानी से उन्हें विम का उपयोग करके निकाल सकते हैं , यहाँ कदम हैं:

1) अपने टर्मिनल में, vim का उपयोग करके फ़ाइल खोलें:

vim file_name

2) सभी BOM वर्णों को निकालें :

:set nobomb

3) फ़ाइल सहेजें:

:wq

इस समाधान ने मेरे लिए काम किया। यह चयनित उत्तर की तुलना में सरल है। धन्यवाद
szydan

मैं इस महान समाधान का इस्तेमाल किया, भले ही मैं आम तौर पर एक emacs पक्षपातपूर्ण हूँ। vim ftw
एलेन स्पार्टस

30

उन वर्णों को हटाने का एक और तरीका - विम का उपयोग करना :

vim -b फ़ाइलनाम

अब वे "छिपे हुए" अक्षर दिखाई दे रहे हैं ( <feff>) और उन्हें हटाया जा सकता है।


20

पिछले उत्तर के लिए धन्यवाद, यहाँ एक मामला है (1) केवल मामले में संस्करण:

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

1
अन्य स्रोतों का सुझाव है कि आकृति 1 को केवल "पहली पंक्ति / s \ xEF \ xBB \ xBF //" के रूप में, patttern में प्रीपेन्ड करें। हालांकि, मैक ओएस एक्स पर मेरे लिए, न तो काम करता है।
मैरियन

1
यह काम किया, और मेरे लिए सबसे अच्छा समाधान था। धन्यवाद महोदय!
वेंस लुकास

1
इस समाधान को पसंद किया। लागू करने के लिए सबसे आसान और अभी भी स्केलेबल ... :)
पिको

1
@ मेरियन थोड़ी देर से, लेकिन आप मासूम के जवाब की जांच कर सकते हैं कि यह दिखाता है कि यह मैक पर काम क्यों नहीं करता है।
कोई व्यक्ति अभी भी आपको

1
परिवर्तनों के साथ फ़ाइल (एस) को अपडेट करने के लिए एड-आई सेड करें।
जोहान

17

यूनिक्स / लिनक्स पर:

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

MacOSX पर

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

मैक के लिए sed के बाद $ को नोटिस करें।

विंडोज पर

नहीं है सुपर Sed sed का एक उन्नत संस्करण। विंडोज के लिए यह एक स्टैंडअलोन .exe है, जिसका उद्देश्य कमांड लाइन से चलने के लिए है।


1
"मैक के लिए sed के बाद $ को नोटिस करें।" - धन्यवाद महोदय!
कोई अभी भी आपको

1
बैश "सी-स्टाइल" स्ट्रिंग $'\xEF\xBB\xBF//'एक बैश फीचर है, विशेष रूप से मैक या ओएसएक्स फीचर नहीं। इस विरोधाभास के कारण, बैश कमांड लाइन को पास करने से पहले वास्तविक बाइट्स में भागने के क्रम को पार्स करेगा sed। आपके sedसंस्करण के आधार पर , यह काम कर सकता है या नहीं भी हो सकता है (हालांकि मुझे यकीन है कि यह OSX उपयोगकर्ताओं के लिए उपयोगी है यह जानने के लिए कि यह उनके लिए बॉक्स से बाहर काम करना चाहिए)।
ट्रिपल

1
शायद sed -i 's /.../../' '
Arthur

6

पूंछ का उपयोग करना आसान हो सकता है:

tail --bytes=+4 filename > new_filename

1
फ़ाइल के निर्माता द्वारा BOM को हटाने के बाद यह तकनीक विफल हो जाएगी। स्केलेबल नहीं ... :)
पिको

4

@ ट्रिपलआई का समाधान मेरे काम नहीं आया। लेकिन फ़ाइल एन्कोडिंग को बदलकर ASCII और फिर से UTF-8 करने की कोशिश ने :-)



2

'फ़ाइल' कमांड दिखाता है कि BOM मौजूद है:

उदाहरण के लिए: 'फ़ाइल myfile.xml' प्रदर्शित करता है: "XML 1.0 दस्तावेज़, UTF-8 यूनिकोड (BOM के साथ) पाठ, बहुत लंबी लाइनों के साथ, CRLF लाइन टर्मिनेटर के साथ"

dos2unix BOM को हटा देगा।



1

में उदात्त पाठ आप स्थापित कर सकते हैं हाइलाइटर पैकेज और फिर अपने उपयोगकर्ता सेटिंग्स में नियमित अभिव्यक्ति अनुकूलित।

यहां मैंने संपत्ति \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 / उदात्त-पाठ -3 / संकुल / प्रयोक्ता / highlighter.sublime-सेटिंग


1

मैं "dos2unix" टूल के उपयोग का सुझाव देता हूं, कृपया चलाने के लिए परीक्षण करें dos2unix ./thefile.js

यदि आवश्यक हो तो कई फ़ाइलों के लिए इस तरह का उपयोग करने की कोशिश करें:

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

मेरा अभिवादन।


1
मुझे आपका उत्तर पसंद आया - bomstripमेरे मैक पर आसानी से उपलब्ध नहीं था - इसलिए आपको सरल संस्करण देने में समय लग रहा है:find . -type f -exec dos2unix '{}' +
dsz

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.