2013-10-29 10 views
7

मैं ascii अक्षर को utf-8 में बदलने की कोशिश कर रहा हूं।चार्डेट क्यों कहता है कि मेरी यूटीएफ -8-एन्कोडेड स्ट्रिंग (मूल रूप से आईएसओ -885 9 -1 से डीकोडेड) ASCII है?

chunk = chunk.decode('ISO-8859-1').encode('UTF-8') 
print chardet.detect(chunk[0:2000]) 

यह रिटर्न:

{'confidence': 1.0, 'encoding': 'ascii'} 

कैसे आ इस छोटे उदाहरण नीचे अभी भी ASCII वर्ण देता है?

+0

'" foobar ".encode ('utf-8')' foobar' है। – georg

उत्तर

7

पायथन के documentation से हवाला देते हुए:

UTF-8 है कई सुविधाजनक गुण:

  1. यह किसी भी यूनिकोड कोड बिंदु संभाल कर सकते हैं।

  2. एक यूनिकोड स्ट्रिंग कोई एम्बेडेड शून्य बाइट्स वाले बाइट्स के एक स्ट्रिंग में बदल गया है। यह बाइट ऑर्डरिंग मुद्दों से बचाता है, और इसका मतलब है कि यूटीएफ -8 तारों को सी कार्यों जैसे स्ट्रैपी() द्वारा संसाधित किया जा सकता है और प्रोटोकॉल के माध्यम से भेजा जा सकता है जो शून्य बाइट्स को संभाल नहीं सकता है।

  3. एएससीआईआईआई पाठ की एक स्ट्रिंग भी एक वैध यूटीएफ -8 पाठ है।

सभी ASCII ग्रंथों भी वैध UTF-8 ग्रंथों कर रहे हैं।

यह स्पष्ट करने के लिए, इस कंसोल सत्र की जाँच (UTF-8 ASCII का सुपरसेट है):

:

>>> s = 'test' 
>>> s.encode('ascii') == s.encode('utf-8') 
True 
>>> 

बहरहाल, UTF-8 एन्कोडिंग के साथ सभी स्ट्रिंग मान्य ASCII स्ट्रिंग है

>>> foreign_string = u"éâô" 
>>> foreign_string.encode('utf-8') 
'\xc3\xa9\xc3\xa2\xc3\xb4' 
>>> foreign_string.encode('ascii') #This won't work, since it's invalid in ASCII encoding 

Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    foreign_string.encode('ascii') 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 
>>> 

तो, chardet अभी भी सही है। केवल अगर कोई ऐसा चरित्र है जो असीसी नहीं है, chardet यह बताने में सक्षम होगा, यह एएससीआई एन्कोडेड नहीं है।

आशा है कि यह सरल स्पष्टीकरण मदद करता है!

1

यही कारण है कि आप ascii

https://github.com/erikrose/chardet/blob/master/chardet/universaldetector.py#L135

मिला है, तो अनुक्रम में सभी पात्रों ascii प्रतीकों chardetascii

N.B. के रूप में स्ट्रिंग एन्कोडिंग पर विचार

जो अनुरूप यूनिकोड के पहले 128 वर्ण, एक-से-एक ASCII के साथ, ASCII के रूप में ही बाइनरी मान के साथ एक एकल ओकटेट का उपयोग कर, साथ ही मान्य ASCII पाठ वैध UTF-8 एन्कोड यूनिकोड बनाने इनकोड ।

3

यूटीएफ -8 ASCII का सुपरसैट है। इसका अर्थ यह है कि प्रत्येक वैध असीसी फ़ाइल (जो केवल पहले 128 वर्णों का उपयोग करती है, विस्तारित वर्ण नहीं) एक मान्य यूटीएफ -8 फ़ाइल भी होगी। चूंकि एन्कोडिंग स्पष्ट रूप से संग्रहीत नहीं होती है, लेकिन हर बार अनुमान लगाया जाता है, यह सरल चरित्र सेट के लिए डिफ़ॉल्ट होगा।हालांकि, अगर आप यूटीएफ -8 में मूल 128 वर्णों (जैसे विदेशी पाठ और इस तरह) से परे कुछ भी एन्कोड करना चाहते थे, तो यह एटीडीएफ -8 के रूप में एन्कोडिंग अनुमान लगाने की संभावना होगी।

संबंधित मुद्दे