2012-04-23 16 views
8
>>> a = "我" # chinese 
>>> b = unicode(a,"gb2312") 
>>> a.__class__ 
<type 'str'> 
>>> b.__class__ 
<type 'unicode'> # b is unicode 
>>> a 
'\xce\xd2' 
>>> b 
u'\u6211' 

>>> c = u"我" 
>>> c.__class__ 
<type 'unicode'> # c is unicode 
>>> c 
u'\xce\xd2' 

b और c सभी यूनिकोड हैं, लेकिन >>> b आउटपुट u'\u6211', और >>> c आउटपुट u'\xce\xd2', क्यों?यूनिकोड और `डिकोड()` पायथन में

+0

आप किस टर्मिनल का उपयोग कर रहे हैं? मैं अपने यूनिकोड gnome-terminal ('c === u '\ u6211'') –

+0

@ChrisMorgan I पर इन कोडों का परीक्षण आईडीई में परिणामों का पुन: उत्पन्न नहीं कर सकता। –

+0

आईडीएलई के साथ इसे भी repro कर सकते हैं –

उत्तर

12

जब आप "我" दर्ज करते हैं, तो पाइथन दुभाषिया टर्मिनल से आपके स्थानीय चरित्र सेट में उस चरित्र का प्रतिनिधित्व करता है, जो "" की वजह से एक स्ट्रिंग बाइट-बाय-बाइट में संग्रहीत करता है। मेरे यूटीएफ -8 सिस्टम पर, यह है। आपके पर, यह '\xce\xd2' है क्योंकि आप GB2312 का उपयोग करते हैं। यह आपके चर a के मान को समझाता है।

जब आप u"我" दर्ज करते हैं, अजगर दुभाषिया पता है नहीं जो चरित्र एन्कोडिंग में है क्या यह होता है काफी एक साधारण स्ट्रिंग के लिए के रूप में ही है। यह एक यूनिकोड स्ट्रिंग में चरित्र के बाइट्स संग्रहीत करता है, प्रत्येक बाइट को यूनिकोड कोडपॉइंट के रूप में व्याख्या करना, इसलिए गलत परिणाम u'\xce\xd2' (या, मेरे बॉक्स पर, u'\xe6\x88\x91')।

यह समस्या केवल इंटरैक्टिव दुभाषिया में मौजूद है। जब आप पाइथन स्क्रिप्ट या मॉड्यूल लिखते हैं, तो आप शीर्ष के पास specify the encoding कर सकते हैं और यूनिकोड स्ट्रिंग ठीक से बाहर आ जाएंगी।

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print(u"liberté") 
print("liberté") 
0

इंटरैक्टिव अजगर शो एक वस्तु का प्रतिनिधित्व जब तुम सिर्फ टाइप में इसका नाम: जैसे, अपने सिस्टम पर, निम्न शब्द लिबर्टे दो बार प्रिंट करता है। दूसरी तरफ, प्रिंट कमांड चरित्र को प्रस्तुत करने की कोशिश करता है। आपके चर नाम एक स्ट्रिंग प्रकार का है। असल में, पायथन 2.x में तार बाइट्स की श्रृंखला हैं। तो, यह आपके कामकाजी माहौल पर निर्भर करता है। आप यूनिकोड() फ़ंक्शन से कहते हैं कि अब आप gb2312 एन्कोडिंग का उपयोग करते हैं। यदि यह सत्य है, तो बी में दिए गए एन्कोडिंग में वर्ण का सही प्रतिनिधित्व शामिल है।

कोशिश

>>> print b 
अपने मामले में

करने के लिए। यह संभावना है कि आप वांछित परिणाम देखेंगे। यह भी प्रयास करें:

>>> print repr(a) 
... 
>>> print repr(b) 

प्रतिनिधित्व है (यदि संभव हो तो) एक पाठ स्ट्रिंग है कि जब प्रतिलिपि चिपकाया एक स्रोत कोड के लिए समान मूल्य वाली वस्तु बन जाएगा।

मार्क पिलग्रीम के "पाइथन 3 में डाइव", अध्याय 4 पर एक नज़र डालें। स्ट्रिंग्स (http://getpython3.com/diveintopython3/strings.html) एक अच्छी, पठनीय स्पष्टीकरण के लिए।

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