मैं किसी टेक्स्ट फ़ाइल के एन्कोडिंग का परीक्षण कैसे कर सकता हूं ... क्या यह वैध है, और यह क्या है?


46

मेरे पास कई .htmफाइलें हैं जो बिना किसी चेतावनी / त्रुटि के गेडिट में खुलती हैं , लेकिन जब मैं इन समान फाइलों को खोलता हूं Jedit, तो यह मुझे अमान्य UTF-8 एन्कोडिंग की चेतावनी देती है ...

HTML मेटा टैग में कहा गया है "charset = ISO-8859-1"। जेडिट एक गिरावट की सूची और ऑटो-डिटेक्टरों को एन्कोडिंग की सूची (वर्तमान में "बीओएम एक्सएमएल-पीआई") की अनुमति देता है, इसलिए मेरी तत्काल समस्या का समाधान हो गया है। लेकिन यह मेरे बारे में सोच रहा था: क्या होगा यदि मेटा डेटा नहीं था?

जब एन्कोडिंग जानकारी बस उपलब्ध नहीं होती है, तो क्या कोई सीएलआई कार्यक्रम होता है जो एन्कोडिंग लागू हो सकता है, जिसमें से "सर्वश्रेष्ठ-अनुमान" बना सकता है?

और, हालाँकि यह थोड़ा अलग मुद्दा है; क्या कोई CLI प्रोग्राम है जो किसी ज्ञात एन्कोडिंग की वैधता का परीक्षण करता है ?


"ऑटो फ़ाइल का पता लगाने के लिए एन्कोडिंग कैसे करें?" superuser.com/questions/301552/…
buzz3791

जवाबों:


60

fileआदेश एन्कोडिंग के बारे में "सर्वश्रेष्ठ अनुमान" बनाता है। एन्कोडिंग के बारे में जानकारी मुद्रित करने के -iलिए बाध्य fileकरने के लिए पैरामीटर का उपयोग करें ।

प्रदर्शन:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

यहाँ बताया गया है कि मैंने फाइलें कैसे बनाई:

$ echo ä > umlaut-utf8.txt 

आजकल सब कुछ utf-8 है। लेकिन खुद को मनाओ:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

Https://en.wikipedia.org/wiki/Com#Computer_encoding के साथ तुलना करें

अन्य एन्कोडिंग में परिवर्तित करें:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

हेक्स डंप की जाँच करें:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

तीनों को मिलाकर कुछ "अवैध" बनाएं:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

क्या fileकहता है:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

बिना -i:

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

fileआदेश "वैध" या "अवैध" का पता नहीं है। यह सिर्फ कुछ बाइट्स देखता है और अनुमान लगाने की कोशिश करता है कि एन्कोडिंग क्या हो सकता है। मनुष्य के रूप में हम यह पहचानने में सक्षम हो सकते हैं कि एक फ़ाइल "गलत" एन्कोडिंग में कुछ umlauts के साथ एक पाठ फ़ाइल है। लेकिन एक कंप्यूटर के रूप में इसे किसी प्रकार की कृत्रिम बुद्धि की आवश्यकता होगी।

हो सकता है कि कोई तर्क दे कि fileकृत्रिम बुद्धि कुछ प्रकार की है। फिर भी, भले ही यह बहुत सीमित है।

यहाँ fileकमांड के बारे में अधिक जानकारी है : http://www.linfo.org/file_command.html


धन्यवाद, यह काम किया ... मैंने 'फ़ाइल , but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1. फ़ाइल -i ' की कोशिश की थी unknown-8bit। तो, यह भी इसका उत्तर प्रतीत होता है: "कैसे एक अवैध / अज्ञात एन्कोडिंग का पता लगाने के लिए"
पीटर.ओआर 19'11

जो लोग यहां आते हैं और मैक पर हैं, उनके लिए यह file -Iलोअरकेस के बजाय एक राजधानी 'i' के साथ है।
समुरासीउल

21

यह सुनिश्चित करना हमेशा संभव नहीं होता है कि टेक्स्ट फ़ाइल की एन्कोडिंग क्या है। उदाहरण के लिए, बाइट अनुक्रम \303\275( c3 bdहेक्साडेसिमल में) ýयूटीएफ -8 ýमें, या Ă˝लैटिन 1 में, या लैटिन 2 में, या बीआईजी -5 में हो सकता है, और इसी तरह।

कुछ एनकोडिंग में अमान्य बाइट अनुक्रम होते हैं, इसलिए उन्हें सुनिश्चित करने के लिए नियम बनाना संभव है। यह विशेष रूप से UTF-8 में सच है; अधिकांश 8-बिट एन्कोडिंग में अधिकांश ग्रंथ मान्य UTF-8 नहीं हैं। आप मान्य यूटीएफ -8 के लिए परीक्षण कर सकते हैं isutf8और अधिक या iconv -f utf-8 -t utf-8 >/dev/nullअन्य लोगों के साथ।

ऐसे उपकरण हैं जो टेक्स्ट फ़ाइल के एन्कोडिंग का अनुमान लगाने की कोशिश करते हैं। वे गलती कर सकते हैं, लेकिन वे अक्सर अभ्यास में काम करते हैं जब तक कि आप जानबूझकर उन्हें बेवकूफ बनाने की कोशिश नहीं करते हैं।

  • file
  • पर्लEncode::Guess (मानक वितरण का हिस्सा) एक बाइट स्ट्रिंग पर क्रमिक एन्कोडिंग की कोशिश करता है और पहला एन्कोडिंग देता है जिसमें स्ट्रिंग मान्य पाठ है।
  • Enca एक एन्कोडिंग अनुमानक और कनवर्टर है। आप इसे एक भाषा का नाम और पाठ दे सकते हैं जिसे आप मानते हैं उस भाषा में है (समर्थित भाषाएँ ज्यादातर पूर्वी यूरोपीय भाषाएँ हैं), और यह एन्कोडिंग का अनुमान लगाने की कोशिश करती है।

यदि फ़ाइल में मेटाडेटा (HTML / XML charset=, TeX \inputenc, emacs -*-coding-*-, ...) है, तो Emacs या Vim जैसे उन्नत संपादक अक्सर उस मेटाडेटा को पार्स करने में सक्षम होते हैं। हालांकि कमांड लाइन से स्वचालित करना आसान नहीं है।


अच्छे अवलोकन के लिए धन्यवाद ... हाँ, "सर्वश्रेष्ठ-अनुमान" एकमात्र विकल्प हो सकता है जब एन्कोडिंग का पता नहीं iconvचल रहा हो ... का उपयोग करते हुए , मैंने iconv -lअपनी सभी .htm फ़ाइलों के विरुद्ध सूचीबद्ध सभी 1168 एन्कोडिंग (उपनाम सहित) को चलाया। ... वहाँ 683 एन्कोडिंग थे जो मस्टर से गुजरे थे। फ़ाइल का वास्तविक चार्ट = ISO-8859-1 .. सभी बार एक ASCII- श्रेणी के मानों से बना था .. गैर- ASCII char \ xA9 था।
पीटर।

0

इसके अलावा, यदि आप फ़ाइल -i आपको अज्ञात देते हैं

आप इस php कमांड का उपयोग कर सकते हैं जो नीचे की तरह चारसेट का अनुमान लगा सकता है:

Php में आप नीचे की तरह देख सकते हैं:

स्पष्ट रूप से एन्कोडिंग सूची निर्दिष्ट करना:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

अधिक सटीक " mb_list_encodings ":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

यहाँ पहले उदाहरण में, आप देख सकते हैं कि मैं एन्कोडिंग्स (सूची क्रम का पता लगाने) की एक सूची रखता हूँ जो मिलान हो सकता है। अधिक सटीक परिणाम के लिए आप सभी संभव एन्कोडिंग का उपयोग कर सकते हैं: mb_list_encodings ()

नोट mb_ * फ़ंक्शंस के लिए php-mbstring की आवश्यकता होती है

apt-get install php-mbstring 

उत्तर देखें: https://stackoverflow.com/a/57010566/3382822

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