पायथन: यूनिकोड-एस्कैप्ड स्ट्रिंग पर .format () का उपयोग करना


156

मैं पाइथन 2.6.5 का उपयोग कर रहा हूं। मेरे कोड को "अधिक से अधिक या बराबर" चिह्न के उपयोग की आवश्यकता है। ये रहा:

>>> s = u'\u2265'
>>> print s
>>> 
>>> print "{0}".format(s)
Traceback (most recent call last):
     File "<input>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265'
  in position 0: ordinal not in range(128)`  

मुझे यह त्रुटि क्यों मिली? क्या ऐसा करने का एक सही तरीका है? मुझे .format()फ़ंक्शन का उपयोग करने की आवश्यकता है ।

जवाबों:


243

बस दूसरा स्ट्रिंग भी एक यूनिकोड स्ट्रिंग बनाएं

>>> s = u'\u2265'
>>> print s

>>> print "{0}".format(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
>>> print u"{0}".format(s)
≥
>>> 

40
@ किट: यदि आप चाहते हैं कि सभी शाब्दिक यूनिकोड (जैसे पायथन 3) हों, तो from __future__ import unicode_literalsअपनी स्रोत फ़ाइलों की शुरुआत में रखें।
फिलिप

1
यदि यह "% s"% u "\ u2265" के रूप में काम करने के लिए उपयोग किया जाता है, तो हाँ, यह आपको मिल जाएगा, लेकिन "{}"। प्रारूप (u "\ u2265") एक अपवाद को फेंक देगा।
हाइलिडन

2
क्या एक साधारण बात है .. जब तक मुझे यह पता नहीं चला कि मुझे कितना भयानक सिरदर्द मिला है ..
Iosu S.


5

पर थोड़ी अधिक जानकारी क्यों होता है, इस ।

>>> s = u'\u2265'
>>> print s

क्योंकि काम करता है print स्वचालित रूप से आपके पर्यावरण के लिए सिस्टम एन्कोडिंग का उपयोग करता है, जो संभवतः UTF-8 के लिए सेट किया गया था। (आप कर के देख सकते हैं import sys; print sys.stdout.encoding)

>>> print "{0}".format(s)

विफल हो जाता है क्योंकि formatयह उस प्रकार के एन्कोडिंग से मेल खाने की कोशिश करता है जिसे यह कहा जाता है (मुझे इस पर प्रलेखन नहीं मिला, लेकिन यह वह व्यवहार है जिसे मैंने देखा है)। चूंकि स्ट्रिंग शाब्दिक बाइट स्ट्रिंग्स हैं जो कि अजगर 2 में ASCII के रूप में एन्कोडेड हैं,format करने की कोशिश करता है s, जिसके परिणामस्वरूप उस अपवाद का परिणाम होता है। का निरीक्षण करें:

>>> s = u'\u2265'
>>> s.encode('ascii')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)

इसलिए कि मूल रूप से ये दृष्टिकोण काम क्यों करते हैं:

>>> s = u'\u2265'
>>> print u'{}'.format(s)

>>> print '{}'.format(s.encode('utf-8'))

स्रोत वर्ण सेट एन्कोडिंग घोषणा द्वारा परिभाषित किया गया है; यह ASCII है यदि स्रोत फ़ाइल में कोई एन्कोडिंग घोषणा नहीं दी गई है ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )


1
ओह और मुझे यह अजगर में यूनिकोड समझने में बहुत मदद करने के लिए मिला, और सामान्य रूप से कंप्यूटर सिस्टम में टेक्स्ट प्रतिनिधित्व: nedbatchelder.com/text/unipain.html
lps
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.