2013-02-12 55 views
5
# -*- coding: utf-8 -*- 

a = 'éáűőúöüó€' 
print type(a) # <type 'str'> 
print a   # éáűőúöüó€ 
print ord(a[-1]) # 172 

यह क्यों काम कर रहा है? यह SyntaxError: Non-ASCII character '\xc3' in file ... नहीं होना चाहिए? स्ट्रिंग में यूनिकोड अक्षर हैं।पाइथन दुभाषिया में इन तारों को आंतरिक रूप से कैसे प्रदर्शित किया जाता है? मुझे समझ में नहीं आता

जब मैंने इसे u साथ उपसर्ग, परिणाम भिन्न हैं:

# -*- coding: utf-8 -*- 

a = u'éáűőúöüó€' 
print type(a) # <type 'unicode'> 
print a   # éáűőúöüó€ 
print ord(a[-1]) # 8364 

क्यों? पायथन में आंतरिक प्रतिनिधित्व के बीच क्या अंतर है? मैं इसे खुद कैसे देख सकता हूं? :)

+0

क्यों यह होना चाहिए एक वाक्यविन्यास त्रुटि हो एक बाइट स्ट्रिंग में बाइट्स है? – geoffspear

+0

ठीक है, तो पहली स्ट्रिंग क्या है और दूसरा क्या है? – kissgyorgy

+2

पहला एक 'str' ऑब्जेक्ट है जिसमें फ़ाइल में यूटीएफ -8 बाइट शामिल हैं। दूसरा यूटीएफ -8 को डीकोड करके गठित 'यूनिकोड' ऑब्जेक्ट है। अंतर देखने के लिए 'repr()' का उपयोग करें। – geoffspear

उत्तर

9

वहाँ स्ट्रिंग

नहीं में यूनिकोड शाब्दिक हैं, वहाँ नहीं हैं। स्ट्रिंग में बाइट्स हैं। जब आप फ़ाइल बनाते हैं तो पाइथन बस आपके संपादक को डिस्क पर सहेजे गए बाइट्स के साथ जाता है।

जब आप u'' के साथ स्ट्रिंग को प्रीफ़िक्स करते हैं, तो आपने पाइथन पर संकेत दिया है कि आप इसके बजाय unicode ऑब्जेक्ट बना रहे हैं। पाइथन अब आपके स्रोत फ़ाइल के शीर्ष पर निर्दिष्ट एन्कोडिंग पर ध्यान देता है, और यह डीकोड स्रोत फ़ाइल में बाइट्स unicode ऑब्जेक्ट पर निर्दिष्ट एन्कोडिंग के आधार पर ऑब्जेक्ट पर ध्यान देता है।

दोनों मामलों में, अपने संपादक को एक फ़ाइल में बाइट्स की एक श्रृंखला को बचाया, चरित्र के लिए, UTF-8 एन्कोडिंग तीन बाइट्स, E282AC के रूप में हेक्साडेसिमल में प्रतिनिधित्व है। बाइटस्ट्रिंग में अंतिम बाइट इस प्रकार एसी है, या दशमलव में 172 है। एक बार जब आप यूटीएफ -8 के रूप में अंतिम 3 बाइट्स को डीकोड करते हैं, तो वे एक साथ यूनिकोड कोडपॉइंट यू + 20 एसी बन जाते हैं, जो दशमलव में 8364 है।

आप वास्तव में अजगर और यूनिकोड को पढ़ने करना चाहिए:

+1

वाह, महान उत्तर धन्यवाद! मैंने पहले से ही पहला लिंक पढ़ा है, फिर भी अंतर को समझ में नहीं आया। अब यह क्रिस्टल स्पष्ट है! :) – kissgyorgy