समस्याओं मैं यूनिकोड तार के साथ काम किया है का मुख्य स्रोत है जब आप utf-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')
कर रहे हैं।
मुझे उम्मीद है कि यह यूनिकोड स्ट्रिंग का उपयोग करते समय संभावित गॉथस को समझने में आपकी सहायता करेगा।
मैं 'str()' या 'एन्कोड() 'समाधानों के बजाय' डीकोड() 'समाधान के साथ जाने का सुझाव दूंगा: जितनी बार आप यूनिकोड ऑब्जेक्ट्स का उपयोग करते हैं, उतना स्पष्ट कोड है, क्योंकि आप जो चाहते हैं एक बाहरी रूप से निहित एन्कोडिंग के साथ बाइट्स के सरणी नहीं, वर्णों के तारों का उपयोग करें। – EOL
कृपया अपनी शब्दावली को ठीक करें।'जब आप यूटीएफ -8 एन्कोडेड तारों को यूनिकोड वाले यूटीएफ -8 के साथ मिश्रित करते हैं और यूनिकोड 2 अलग-अलग एन्कोडिंग नहीं करते हैं; यूनिकोड एक मानक है और यूटीएफ -8 एन्कोडिंग में से एक है जो इसे परिभाषित करता है। – Kos
@ कोस: मुझे लगता है कि उसका मतलब है "यूटीएफ -8 एन्कोडेड स्ट्रिंग्स" * ऑब्जेक्ट्स * यूनिकोड (इसलिए डीकोडेड) * ऑब्जेक्ट्स * के साथ। पूर्व प्रकार 'str' प्रकार है, बाद वाला प्रकार' यूनिकोड 'है। विभिन्न ऑब्जेक्ट्स होने के नाते, यदि आप – MestreLion