पाठ फ़ाइल एन्कोडिंग का पता लगाने के लिए ऑटो कैसे?


69

कई सादे पाठ फाइलें हैं, जिन्हें विभिन्न प्रकार के चार्ट में एन्कोड किया गया था।

मैं उन सभी को UTF-8 में परिवर्तित करना चाहता हूं, लेकिन iconv चलाने से पहले, मुझे इसकी मूल एन्कोडिंग जानने की आवश्यकता है। अधिकांश ब्राउज़रों के पास Auto Detectएनकोडिंग में एक विकल्प है, हालांकि, मैं एक-एक करके उन पाठ फ़ाइलों की जांच नहीं कर सकता क्योंकि बहुत सारे हैं।

केवल मूल एन्कोडिंग ज्ञात होने के बाद, मैं तब ग्रंथों को परिवर्तित कर सकता हूं iconv -f DETECTED_CHARSET -t utf-8

क्या सादा पाठ फ़ाइलों के एन्कोडिंग का पता लगाने के लिए कोई उपयोगिता है? यह 100% सही होना जरूरी नहीं है, मुझे कोई आपत्ति नहीं है अगर 100 फाइलों को 1,000,000 फाइलों में गलत लिखा जाता है।

जवाबों:


57

पाइर्ड पायथन मॉड्यूल की कोशिश करें , जो PyPi पर उपलब्ध है:

pip install chardet

फिर चला chardetect myfile.txt

चर्डेट मोज़िला द्वारा उपयोग किए जाने वाले पहचान कोड पर आधारित है , इसलिए इसे उचित परिणाम देना चाहिए, बशर्ते कि इनपुट टेक्स्ट लंबे समय तक सांख्यिकीय विश्लेषण के लिए पर्याप्त हो। परियोजना प्रलेखन पढ़ें ।

जैसा कि टिप्पणियों में उल्लेख किया गया है, यह काफी धीमा है, लेकिन कुछ वितरण मूल C ++ संस्करण को भी शिप करते हैं जैसा कि @Xavier ने https://superuser.com/a/609056 में पाया है । कहीं-कहीं जावा संस्करण भी है।


3
हां, और यह पहले से ही python-chardetउबंटू ब्रह्मांड रेपो में पैक है ।
क्ले जेली

यदि यह एक सही अनुमान नहीं था, chardetतो अभी भी सबसे सही अनुमान देगा, जैसे ./a.txt: GB2312 (confidence: 0.99)। Enca की तुलना में जो अभी असफल रही और 'अनजाने एन्कोडिंग' की रिपोर्ट की। हालांकि, दुख की बात है, chardetबहुत धीमी गति से चलता है।
ग्यारहवें

1
@ @ Something 雷: यह रात भर चला है या ऐसा कुछ। चारसेट का पता लगाने है एक जटिल प्रक्रिया । आप जावा-आधारित जेकार्ड या कोशिश कर सकते हैं ... मूल चार्ट मोजिला का हिस्सा है , लेकिन केवल C ++ स्रोत उपलब्ध है, कोई कमांड-लाइन टूल नहीं है।
grawity

2
गति के बारे में: दौड़ना chardet <(head -c4000 filename.txt)मेरे उपयोग के मामले के लिए बहुत तेज और समान रूप से सफल रहा। (यदि यह स्पष्ट नहीं है कि यह बैश वाक्यविन्यास केवल पहले 4000 बाइट्स को चार्टेट में भेजेगा)
ndemou

@ndemou मेरे पास है chardet==3.0.4, और कमांड लाइन टूल का वास्तविक निष्पादन योग्य नाम chardetectनहीं है chardet
देव

31

मैं इस सरल कमांड का उपयोग करूंगा:

encoding=$(file -bi myfile.txt)

या यदि आप केवल वास्तविक वर्ण सेट चाहते हैं (जैसे utf-8):

encoding=$(file -b --mime-encoding myfile.txt)

4
दुर्भाग्य से, fileकेवल विशिष्ट गुणों जैसे कि UTF-8 या UTF-16 के साथ एन्कोडिंग का पता लगाता है। बाकी - पुराने ISO8859 या उनके MS-DOS और विंडोज संवाददाताओं - को "अज्ञात -8 बिट" या कुछ समान के रूप में सूचीबद्ध किया गया है, यहां तक ​​कि उन फ़ाइलों के लिए भी जो chardet99% आत्मविश्वास के साथ पता लगाते हैं ।
ग्रेविटी

6
फ़ाइल ने मुझे iso-8859-1 दिखाया
cweiske

अगर विस्तार झूठ बोल रहा है तो क्या होगा?
james.garriss

2
@ james.garriss: फ़ाइल एक्सटेंशन का इसके (पाठ) सामग्री एन्कोडिंग से कोई लेना-देना नहीं है।
MestreLion

29

डेबियन-आधारित लिनक्स पर, यूचर्ड पैकेज ( डेबियन / उबंटू ) एक कमांड लाइन टूल प्रदान करता है। पैकेज विवरण के नीचे देखें:

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html

3
धन्यवाद! परियोजना के मुखपृष्ठ से यह मेरे लिए स्पष्ट नहीं था कि इसमें सीएलआई शामिल था। यह होम एक्स के uchardetमाध्यम से स्थापित करते समय ओएस एक्स पर भी उपलब्ध है ।
स्टीफन श्मिट

1
मैं पहली बार में थोड़ा उलझन में था क्योंकि ISO 8859-1 दस्तावेज को Windows-1252 के रूप में गलत तरीके से पहचाना गया था, लेकिन प्रिंट करने योग्य रेंज में Windows-1252 ISO 8859-1 का सुपरसेट है, इसलिए iconvठीक काम के साथ रूपांतरण ।
स्टीफन श्मिट

16

लिनक्स के लिए, enca है और Solaris के लिए आप auto_ef का उपयोग कर सकते हैं ।


एन्का मेरे लिए बहुत सख्त लगता है: enca -d -L zh ./a.txtसंदेश के साथ विफल रहा ./a.txt: Unrecognized encoding Failure reason: No clear winner.जैसा @ उल्लेख किया गया था, chardetअधिक ढीला है, हालांकि यह अभी भी बहुत धीमा है।
शी जेiलई

10
एन्का "वास्तव में कुछ करता है" परीक्षण पूरी तरह से विफल रहता है।
माइकल वुल्फ

1
uchardet विफल रहा (वास्तविक CP1250 के बजाय CP1252 का पता लगाया गया), लेकिन enca ने ठीक काम किया। (एकल उदाहरण, सामान्यीकरण के लिए कठिन ...)
पालो


2

वापस हो रही है chardet (अजगर 2?) यह कॉल पर्याप्त हो सकती है:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

हालाँकि यह एकदम सही है ...।

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}

2

नियमित रूप से Emacs का उपयोग करने वालों के लिए, वे निम्नलिखित उपयोगी पा सकते हैं (मैन्युअल रूप से ट्रांसफ़ोमेशन का निरीक्षण और सत्यापन करने की अनुमति देता है)।

इसके अलावा मुझे अक्सर लगता है कि Emacs char-set ऑटो-डिटेक्शन अन्य char-set ऑटो-डिटेक्शन टूल (जैसे chardet) की तुलना में बहुत अधिक कुशल है।

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

फिर, इस स्क्रिप्ट के साथ Emacs को तर्क के रूप में एक सरल कॉल ("-l" विकल्प देखें) काम करता है।



0

isutf8( moreutilsपैकेज से) नौकरी की


2
कैसे? यह उत्तर वास्तव में मददगार नहीं है।
मूसा

1
यह बिल्कुल नहीं पूछा गया था, लेकिन एक उपयोगी उपकरण है। यदि फ़ाइल UTF-8 मान्य है, तो निकास स्थिति शून्य है। यदि फ़ाइल UTF-8 मान्य नहीं है, या कुछ त्रुटि है, तो निकास स्थिति गैर-शून्य है।
टन

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.