जब मैंने यूनिकोड स्ट्रिंग्स के साथ काम किया है, तो समस्याओं का मुख्य स्रोत यूनिकोड के साथ यूटीएफ -8 एन्कोडेड स्ट्रिंग्स का मिश्रण है।
उदाहरण के लिए, निम्नलिखित लिपियों पर विचार करें।
two.py
# encoding: utf-8
name = 'helló wörld from two'
one.py
# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name
चलने python one.py
का आउटपुट है:
Traceback (most recent call last):
File "one.py", line 5, in <module>
print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
इस उदाहरण में, two.name
एक utf-8 एन्कोडेड स्ट्रिंग है (यूनिकोड नहीं) क्योंकि यह आयात नहीं किया गया है unicode_literals
, और one.name
एक यूनिकोड स्ट्रिंग है। जब आप दोनों को मिलाते हैं, तो अजगर एन्कोडेड स्ट्रिंग (यह एससीआई मानकर) को डिकोड करने की कोशिश करता है और इसे यूनिकोड में बदल देता है और विफल हो जाता है। अगर आप करते तो यह काम करता print name + two.name.decode('utf-8')
।
एक ही बात हो सकती है यदि आप एक स्ट्रिंग को एन्कोड करते हैं और बाद में उन्हें मिश्रण करने का प्रयास करते हैं। उदाहरण के लिए, यह काम करता है:
# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
आउटपुट:
DEBUG: <html><body>helló wörld</body></html>
लेकिन जोड़ने के बाद import unicode_literals
यह नहीं है:
# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
आउटपुट:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)
यह विफल हो जाता है क्योंकि 'DEBUG: %s'
एक यूनिकोड स्ट्रिंग है और इसलिए अजगर डिकोड करने की कोशिश करता है html
। प्रिंट को ठीक करने के कुछ तरीके print str('DEBUG: %s') % html
या तो कर रहे हैं या print 'DEBUG: %s' % html.decode('utf-8')
।
मुझे आशा है कि यह आपको यूनिकोड स्ट्रिंग्स का उपयोग करते समय संभावित गोचरों को समझने में मदद करता है।
decode()
समाधानों के बजाय समाधानों के साथ जाने का सुझाव दूंगा: जितनी बार आप यूनिकोड ऑब्जेक्ट्स का उपयोग करते हैं, कोड उतना ही स्पष्ट होता है, क्योंकि आप जो चाहते हैं वह वर्णों के तारों में हेरफेर करना है, न कि बाहरी बाइट्स के साथ बाइट्स के एक बाहरी रूप से निहित एन्कोडिंग।str()
encode()