BOM (FF FE) से शुरू होने वाली फ़ाइल को संसाधित करें


10

मुझे FF FEBOM के साथ एक .csv फ़ाइल मिली :

$ 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.|

awkइसे पार्स करने के लिए उपयोग करते समय मुझे अशक्त बाइट्स का एक गुच्छा मिल रहा है, जो मुझे संदेह है कि बाइट ऑर्डर के कारण है। मैं इस फ़ाइल (CLI का उपयोग करके) पर बाइट ऑर्डर को कैसे स्वैप कर सकता हूं ताकि सामान्य उपकरण इसके साथ काम करेंगे?

ध्यान दें कि मुझे लगता है कि यह फ़ाइल केवल ASCII वर्ण (BOM को छोड़कर) है, लेकिन मैं पुष्टि नहीं कर सकता grepकि यह सोचता है कि यह एक बाइनरी फ़ाइल है:

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

VIM में समान स्ट्रिंग की खोज करने से हर वर्ण मिलान होता है!

iconvASCII में कनवर्ट करने के लिए उपयोग करने से \ x00 मानों से छुटकारा नहीं मिलता है, वास्तव में यह समस्या को बदतर बना देता है क्योंकि अब वे 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.|

मैं इस फ़ाइल (CLI का उपयोग करके) पर बाइट ऑर्डर को कैसे स्वैप कर सकता हूं ताकि सामान्य उपकरण इसके साथ काम करेंगे?


CSV फ़ाइल जिसे आपने विंडोज या मैक में बनाया है?
congonglm

क्या आप फ़ाइल का एक भाग दे सकते हैं?
कोउंगलम

यहां फ़ाइल के अनाम भाग का लिंक दिया गया है जो इसके साथ अद्वितीय समस्याओं को संरक्षित करता है। धन्यवाद!
डॉटनचेन

जवाबों:


16

इस विकिपीडिया लेख से , का FF FEमतलब है UTF16LE। तो अगर आप को बताना चाहिए iconvसे कन्वर्ट करने के लिए UTF16LEकरने के लिए UTF8:

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

पूर्ण धन्यवाद! मेरे पास UTF-8 और UTF-16 BOM मिश्रित थे: मैंने सोचा था कि FFFE और FEFF UTF-8 थे और मुझे कभी भी UTF-16 BOM (s) नहीं पता था। वास्तव में, वे UTF-16 BOMs हैं, और मैं कभी भी (बेकार) UTF-8 BOM नहीं जानता था!
डॉटनकोहेन

@dotancohen: मैं अपने फेडोरा में परीक्षण tailकरता हूं और समाधान ठीक काम करता है। आप किस ओएस का उपयोग करते हैं?
congonglm

यह विंडोज पर Git Bash में "iconv (GNU libiconv 1.14)" संस्करण के लिए काम नहीं करता (यानी BOM को हटाता है)। लेकिन (जो भी कारण के लिए) UTF-16बाइट-ऑर्डर संस्करणों में से एक के बजाय का उपयोग करके काम करता है।
केनी एविट

3

dos2unix BOM को भी निकालता है और UTF-16 को 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 UTF-8 BOMs भी निकालता है:

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

0

StackOverflow पर भी जवाब दिया: मैं UTF-8 फ़ाइल से BOM कैसे निकाल सकता हूँ? @rici का अच्छा जवाब है।

संक्षिप्त जवाब:

  • संक्षिप्त उत्तर: sed -i $'1s/^\uFEFF//' file.txtलेकिन बीएसडी या ओएस / एक्स पर नहीं।
  • एक अन्य जवाब: vi file.txt, :set nobomb, :w, सरल लेकिन मैनुअल
  • Dos2unuix स्थापित करें; dos2unix -r file.txt
  • इन निशानों के कई संभावित अर्थ हैं, जिनमें यह भी शामिल है कि फ़ाइल UTF-8 है; विकिपीडिया लेख देखें ।
  • विंडोज प्रोग्राम इन निशानों को जोड़ना पसंद करते हैं। अधिकांश संपादक इन निशानों को नहीं हटाएंगे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.