2012-12-02 11 views
16

मुझे पाइथन के string.format() के साथ समस्या हो रही है और इसमें यूनिकोड स्ट्रिंग पास हो रही है। यह this older question के समान है, सिवाय इसके कि मेरे मामले में परीक्षण कोड प्रिंट पर विस्फोट होता है, logging.info() कॉल पर नहीं। लॉगिंग हैंडलर पर एक ही यूनिकोड स्ट्रिंग ऑब्जेक्ट को पास करना ठीक काम करता है।पायथन की स्ट्रिंग.फॉर्मैट() और यूनिकोड

यह पुराने % प्रारूपण के साथ-साथ string.format() के साथ समान रूप से अच्छी तरह विफल रहता है। बस यह सुनिश्चित करने के लिए कि यह स्ट्रिंग ऑब्जेक्ट था जो समस्या है, और मेरे टर्मिनल के साथ बुरी तरह से इंटरैक्टिंग प्रिंट नहीं करता है, मैंने प्रिंट करने से पहले स्वरूपित स्ट्रिंग को एक चर में असाइन करने का प्रयास किया।

def unicode_test(): 
    byte_string = '\xc3\xb4' 
    unicode_string = unicode(byte_string, "utf-8") 
    print "unicode object type: {}".format(type(unicode_string)) 
    output_string = "printed unicode object: {}".format(unicode_string) 
    print output_string 

if __name__ == '__main__': 
    unicode_test() 

स्ट्रिंग ऑब्जेक्ट को लगता है कि यह ASCII प्राप्त कर रहा है।

% python -V 
Python 2.7.2 

% python ./unicodetest.py 
unicode object type: <type 'unicode'> 
Traceback (most recent call last): 
    File "./unicodetest.py", line 10, in <module> 
    unicode_test() 
    File "./unicodetest.py", line 6, in unicode_test 
    output_string = "printed unicode object: {}".format(unicode_string) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf4' in position 0: ordinal not in range(128) 

output_string कास्ट करने के लिए के रूप में यूनिकोड कोई फर्क नहीं पड़ता की कोशिश कर रहा।

output_string = यू "मुद्रित यूनिकोड वस्तु: {}"। प्रारूप (unicode_string)

मैं यहाँ कुछ याद आ रही है? स्ट्रिंग ऑब्जेक्ट के लिए प्रलेखन बहुत स्पष्ट लगता है कि यह काम करना चाहिए क्योंकि मैं इसका उपयोग करने का प्रयास कर रहा हूं।

+0

उपरोक्त के रूप में अपने कोड का उपयोग करना, लेकिन मेरे लिए 'यू' काम के साथ 'मुद्रित यूनिकोड ऑब्जेक्ट' तैयार करना (पायथन 2.6.5 और 2.7)। क्या आप उस त्रुटि को प्राप्त कर रहे हैं जब आप उपर्युक्त सूचीबद्ध करते हैं? – RocketDonkey

+0

रुको ... आप एक यूनिकोड बाइट स्ट्रीम एन्कोड कर रहे हैं जो पहले से ही एन्कोडेड यूनिकोड स्ट्रीम का प्रतिनिधित्व करने वाला है? 'X \ xc3 \ xb4'':' ô' या 'Ã'' के लिए ऊपर वर्ण क्या चरित्र मुद्रित करना चाहिए? –

+0

यह होना चाहिए ô। लॉगिंग मॉड्यूल के बारे में संदर्भित पुरानी पोस्ट से एन्कोडिंग उदाहरण की प्रतिलिपि बनाई गई थी। – mpounsett

उत्तर

22

नहीं, यह काम नहीं करना चाहिए (क्या आप ऐसा दस्तावेज का हिस्सा उद्धृत कर सकते हैं?), लेकिन अगर यह स्वरूपण पैटर्न यूनिकोड है (या पुराने स्वरूपण के साथ जो 'यूनिकोड के पैटर्न को' प्रोमोट करता है ' तर्कों को 'demote' करने की कोशिश कर रहा है)।

>>> x = "\xc3\xb4".decode('utf-8') 
>>> x 
u'\xf4' 
>>> x + 'a' 
u'\xf4a' 
>>> 'a' + x 
u'a\xf4' 
>>> 'a %s' % x 
u'a \xf4' 
>>> 'a {}'.format(x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec 
    can't encode character u'\xf4' in position 0: ordinal not in range(128) 
>>> u'a {}'.format(x) 
u'a \xf4' 
>>> print u"Foo bar {}".format(x) 
Foo bar ô 

संपादित करें: print लाइन आपके लिए काम नहीं हो सकता है यदि यूनिकोड स्ट्रिंग अपने कंसोल के कूट का उपयोग कर इनकोडिंग नहीं किया जा सकता। उदाहरण के लिए, मेरे विंडोज कंसोल पर:

>>> import sys 
>>> sys.stdout.encoding 
'cp852' 
>>> u'\xf4'.encode('cp852') 
'\x93' 

यूनिक्स कंसोल पर यह आपकी लोकेल सेटिंग्स से संबंधित हो सकता है। यदि आप आउटपुट रीडायरेक्ट करते हैं तो यह भी असफल हो जाएगा (जैसे | खोल में)। इनमें से अधिकांश मुद्दों को पायथन 3 में तय किया गया है।

+0

@mpounsett में utf-8 में अपना डिफ़ॉल्ट एन्कोडिंग सेट किया है: ठीक है, जैसा कि आप पोस्ट किए गए कंसोल सत्र में देख सकते हैं, 'आप' जो भी {} '। प्रारूप (u' \ xf4 ') ' काम करता है, तो आप अपना कोड दोबारा जांचना चाहेंगे। क्या त्रुटि बिल्कुल वही है? क्या यह एक ही पंक्ति में होता है या यह अधिक है: http://ideone.com/Z3y5Kg? – lqc

+0

एचआरएम .. मैंने सोचा था कि त्रुटि बिल्कुल वही थी, लेकिन एक रिकैक पर मैं देखता हूं कि यह वास्तव में प्रिंट स्टेटमेंट में माइग्रेट करता है। – mpounsett

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