कैसे ठीक करें: "यूनिकोडडबलर्रर: 'अस्की' कोडक बाइट को डिकोड नहीं कर सकता है"


459
as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!

इसे कैसे जोड़ेंगे?

कुछ अन्य अजगर-आधारित स्थिर ब्लॉग ऐप्स में, चीनी पोस्ट सफलतापूर्वक प्रकाशित की जा सकती है। जैसे कि यह ऐप: http://github.com/vrypan/bucket3 । मेरी साइट http://bc3.brite.biz/ में , चीनी पोस्ट सफलतापूर्वक प्रकाशित की जा सकती है।


जवाबों:


569

tl; डॉआर / क्विक फिक्स

  • विकोडी / एनोडी को डीकोड / एनकोड न करें
  • मान लें कि आपके तार UTF-8 एन्कोडेड नहीं हैं
  • अपने कोड में जितनी जल्दी हो सके स्ट्रिंग्स को यूनिकोड स्ट्रिंग्स में बदलने का प्रयास करें
  • अपने स्थान को ठीक करें: पायथन 3.6 में यूनिकोडड्रेसराइड को कैसे हल करें?
  • त्वरित reloadहैक का उपयोग करने के लिए परीक्षा मत करो

पायथन 2.x में यूनिकोड ज़ेन - लॉन्ग वर्जन

स्रोत को देखे बिना मूल कारण जानना मुश्किल है, इसलिए मुझे आम तौर पर बोलना होगा।

UnicodeDecodeError: 'ascii' codec can't decode byteआम तौर पर तब होता है जब आप एक पायथन 2.x को परिवर्तित करने का प्रयास करते हैं strजिसमें मूल स्ट्रिंग के एन्कोडिंग को निर्दिष्ट किए बिना एक यूनिकोड स्ट्रिंग में गैर-एएससीआईआई होता है।

संक्षेप में, यूनिकोड स्ट्रिंग्स एक पूरी तरह से अलग प्रकार का पायथन स्ट्रिंग है जिसमें कोई एन्कोडिंग नहीं होती है। वे केवल यूनिकोड बिंदु कोड रखते हैं और इसलिए पूरे स्पेक्ट्रम से किसी भी यूनिकोड बिंदु को पकड़ सकते हैं। स्ट्रिंग्स में एन्कोडेड टेक्स्ट होता है, इसके अलावा UTF-8, UTF-16, ISO-8895-1, GBK, Big5 आदि स्ट्रिंग्स को यूनिकोड में डिकोड किया जाता है और यूनिकोड को स्ट्रिंग्स में एनकोड किया जाता है । फ़ाइलें और पाठ डेटा हमेशा एन्कोडेड स्ट्रिंग्स में स्थानांतरित किए जाते हैं।

मार्कडाउन मॉड्यूल लेखक संभवत: unicode()कोड के बाकी हिस्सों के लिए गुणवत्ता गेट के रूप में (जहां अपवाद को फेंक दिया गया है) का उपयोग करते हैं - यह एएससीआईआई या मौजूदा यूनिकोड के तारों को नए यूनिकोड स्ट्रिंग में बदल देगा। मार्कडाउन लेखक आने वाली स्ट्रिंग के एन्कोडिंग को नहीं जान सकते हैं, इसलिए मार्कडाउन में जाने से पहले यूनिकोड के तारों को डिकोड करने के लिए आप पर भरोसा करेंगे।

आपके कोड में यूनिकोड स्ट्रिंग्स को uउपसर्ग का उपयोग करके स्ट्रिंग्स में घोषित किया जा सकता है । उदाहरण के लिए

>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>

यूनिकोड के तार फाइल, डेटाबेस और नेटवर्क मॉड्यूल से भी आ सकते हैं। जब ऐसा होता है, तो आपको एन्कोडिंग के बारे में चिंता करने की आवश्यकता नहीं है।

gotchas

strयूनिकोड से रूपांतरण तब भी हो सकता है जब आप स्पष्ट रूप से कॉल नहीं करते हैं unicode()

निम्नलिखित परिदृश्य UnicodeDecodeErrorअपवाद का कारण बनते हैं:

# Explicit conversion without encoding
unicode('€')

# New style format string into Unicode string
# Python will try to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old style format string into Unicode string
# Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python will try to convert string to Unicode first
u'The currency is: ' + '€'         

उदाहरण

निम्नलिखित आरेख में, आप देख सकते हैं कि caféटर्मिनल प्रकार के आधार पर शब्द "UTF-8" या "Cp1252" एन्कोडिंग में कैसे एन्कोड किया गया है। दोनों उदाहरणों में, cafबस नियमित रूप से एससीआई है। UTF-8 में, éदो बाइट्स का उपयोग करके एन्कोड किया गया है। "Cp1252" में, é 0xE9 है (जो यूनिकोड बिंदु मान होने के लिए भी होता है (यह कोई संयोग नहीं है))। सही decode()को लागू किया जाता है और पायथन यूनिकोड में रूपांतरण सफल होता है: एक स्ट्रिंग के आरेख को पायथन यूनिकोड स्ट्रिंग में परिवर्तित किया जा रहा है

इस आरेख में, के decode()साथ कहा जाता है ascii(जो unicode()किसी एन्कोडिंग के बिना कॉल करने के समान है )। ASCII में बाइट्स से अधिक नहीं हो सकता है 0x7F, यह एक UnicodeDecodeErrorअपवाद फेंक देगा :

गलत एन्कोडिंग के साथ एक स्ट्रिंग के आरेख को पायथन यूनिकोड स्ट्रिंग में परिवर्तित किया जा रहा है

यूनिकोड सैंडविच

अपने कोड में एक यूनिकोड सैंडविच बनाना अच्छा है, जहाँ आप यूनिकोड स्ट्रिंग्स के लिए आने वाले सभी डेटा को डिकोड करते हैं, यूनिकोड के साथ काम करते हैं, फिर strबाहर जाने के रास्ते पर एनकोड करते हैं। यह आपको अपने कोड के बीच में तार के एन्कोडिंग के बारे में चिंता करने से बचाता है।

इनपुट / डिकोड

सोर्स कोड

यदि आपको अपने स्रोत कोड में गैर-एएससीआईआई सेंकना करने की आवश्यकता है, तो बस स्ट्रिंग को उपसर्ग करके यूनिकोड तार बनाएं u। उदाहरण के लिए

u'Zürich'

पायथन को अपने स्रोत कोड को डिकोड करने की अनुमति देने के लिए, आपको अपनी फ़ाइल के वास्तविक एन्कोडिंग से मिलान करने के लिए एन्कोडिंग हेडर जोड़ना होगा। उदाहरण के लिए, यदि आपकी फ़ाइल 'UTF-8' के रूप में एन्कोडेड थी, तो आप उपयोग करेंगे:

# encoding: utf-8

यह तभी आवश्यक है जब आपके स्रोत कोड में गैर-एएससीआईआई हो ।

फ़ाइलें

आमतौर पर गैर-एएससीआईआई डेटा एक फ़ाइल से प्राप्त होता है। ioमॉड्यूल एक TextWrapper कि तेज़ी से अपने फ़ाइल डीकोड, किसी दिए गए का उपयोग कर प्रदान करता है encoding। आपको फ़ाइल के लिए सही एन्कोडिंग का उपयोग करना चाहिए - यह आसानी से अनुमान नहीं लगाया जा सकता है। उदाहरण के लिए, UTF-8 फ़ाइल के लिए:

import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
     my_unicode_string = my_file.read() 

my_unicode_stringतब मार्कडाउन में जाने के लिए उपयुक्त होगा। एक तो UnicodeDecodeErrorसे read()लाइन, तो आप शायद गलत एन्कोडिंग मूल्य का उपयोग किया है।

CSV फ़ाइलें

पायथन 2.7 सीएसवी मॉड्यूल गैर-एएससीआईआई CS का समर्थन नहीं करता है। हालांकि, मदद https://pypi.python.org/pypi/backports.csv के साथ है ।

इसे ऊपर की तरह उपयोग करें लेकिन खोली गई फ़ाइल को पास करें:

from backports import csv
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    for row in csv.reader(my_file):
        yield row

डेटाबेस

अधिकांश पायथन डेटाबेस ड्राइवर यूनिकोड में डेटा वापस कर सकते हैं, लेकिन आमतौर पर थोड़ा कॉन्फ़िगरेशन की आवश्यकता होती है। SQL प्रश्नों के लिए हमेशा यूनिकोड स्ट्रिंग्स का उपयोग करें।

माई एसक्यूएल

कनेक्शन स्ट्रिंग में जोड़ें:

charset='utf8',
use_unicode=True

उदाहरण के लिए

>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
PostgreSQL

जोड़ें:

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

एचटीटीपी

वेब पेजों को केवल किसी भी एन्कोडिंग के बारे में एन्कोड किया जा सकता है। Content-typeहैडर एक को शामिल करना चाहिए charsetएन्कोडिंग में संकेत करने के लिए क्षेत्र। तब सामग्री को इस मान के विरुद्ध मैन्युअल रूप से डिकोड किया जा सकता है। वैकल्पिक रूप से, पायथन-रिक्वेस्ट्स में यूनिकोड की वापसी होती है response.text

मैन्युअल

यदि आपको स्ट्रिंग्स को मैन्युअल रूप से डीकोड करना होगा, तो आप बस कर सकते हैं my_string.decode(encoding), जहां encodingउपयुक्त एन्कोडिंग है। पायथन 2.x समर्थित कोडेक्स यहां दिए गए हैं: मानक एनकोडिंग । फिर, यदि आप प्राप्त करते हैं UnicodeDecodeErrorतो आपको शायद गलत एन्कोडिंग मिल गई है।

सैंडविच का मांस

यूनिकोड के साथ काम करें क्योंकि आप सामान्य स्ट्रैस करेंगे।

उत्पादन

स्टडआउट / प्रिंटिंग

printस्टडआउट स्ट्रीम के माध्यम से लिखते हैं। पायथन ने एक एनकोडर को stdout पर कॉन्फ़िगर करने की कोशिश की ताकि यूनिकोड कंसोल के एन्कोडिंग में एन्कोड हो जाए। उदाहरण के लिए, यदि लिनक्स शेल localeहै en_GB.UTF-8, तो आउटपुट को इनकोड किया जाएगा UTF-8। विंडोज पर, आप एक 8bit कोड पेज तक सीमित रहेंगे।

एक गलत तरीके से कॉन्फ़िगर किया गया कंसोल, जैसे भ्रष्ट स्थान, अप्रत्याशित प्रिंट त्रुटियों को जन्म दे सकता है। PYTHONIOENCODINGपरिवेश चर stdout के लिए एन्कोडिंग को बाध्य कर सकता है।

फ़ाइलें

इनपुट की तरह, io.openयूनिकोड को पारदर्शी रूप से एन्कोडेड बाइट स्ट्रिंग्स में बदलने के लिए उपयोग किया जा सकता है।

डेटाबेस

पढ़ने के लिए एक ही विन्यास यूनिकोड को सीधे लिखने की अनुमति देगा।

अजगर ३

पायथन 3 पायथन 2.x की तुलना में अधिक यूनिकोड सक्षम नहीं है, हालांकि यह विषय पर थोड़ा कम भ्रमित है। जैसे कि नियमित strअब एक यूनिकोड स्ट्रिंग है और पुराना strअब है bytes

डिफ़ॉल्ट एन्कोडिंग UTF-8 है, इसलिए यदि आप .decode()एन्कोडिंग दिए बिना एक बाइट स्ट्रिंग करते हैं, तो पायथन 3 UTF-8 एन्कोडिंग का उपयोग करता है। यह शायद 50% लोगों की यूनिकोड समस्याओं को ठीक करता है।

इसके अलावा, open()डिफ़ॉल्ट रूप से पाठ मोड में काम करता है, इसलिए रिटर्न डिकोडेड str(यूनिकोड वाले)। एन्कोडिंग आपके लोकेल से ली गई है, जो Un * x सिस्टम पर UTF-8 या विंडोज बॉक्स पर एक 8-बिट कोड पेज, जैसे कि विंडोज़ -1251 है।

आप का उपयोग क्यों नहीं करना चाहिए sys.setdefaultencoding('utf8')

यह एक बुरा हैक है (इसका एक कारण है जिसका आपको उपयोग reloadकरना होगा) जो केवल समस्याओं का सामना करेगा और आपके 3. Python में प्रवास को बाधित करेगा। समस्या को समझें, मूल कारण को ठीक करें और यूनिकोड ज़ेन का आनंद लें। देखें कि हमें py स्क्रिप्ट में sys.setdefaultencoding ("utf-8") का उपयोग क्यों नहीं करना चाहिए? अधिक जानकारी के लिए


2
पायथन 2 के जवाब की तलाश में किसी के लिए, एक अधिक उपयोगी TLDR: io.openफ़ाइलों को पढ़ने / लिखने के from __future__ import unicode_literalsलिए उपयोग, यूनिकोड का उपयोग करने के लिए अन्य डेटा इनपुट / आउटपुट (जैसे, डेटाबेस) कॉन्फ़िगर करें।
इडबरी

sooo हम इसे कैसे ठीक करते हैं? योग्य यह एक स्क्रिप्ट लिखने से कोई समस्या नहीं है
मैथ्यू

@ मैथ्यू सेटिंग की कोशिश करें PYTHONIOENCODING=utf-8। यदि वह इसे ठीक नहीं करता है, तो आपको उनके कोड को ठीक करने के लिए स्क्रिप्ट के लेखक से संपर्क करना होगा।
अलास्टेयर मैककॉर्मैक

498

आखिरकार मुझे मिल गया:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

मुझे जाँचने दो:

as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec  6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>

ऊपर दिखाया गया है कि अजगर का डिफ़ॉल्ट एन्कोडिंग है utf8। फिर त्रुटि अधिक नहीं है।


7
मैं यह कोशिश करता हूं, लेकिन यह एन्कोडिंग को स्थायी रूप से नहीं बदल सकता है। एक बार जब अजगर कंसोल से बाहर निकलें और फिर से शुरू, एन्कोडिंग अब भी है एक ही
macemers

37
धन्यवाद! लेकिन आयात करने के बाद हमें sys को फिर से लोड करने की आवश्यकता क्यों है?
दिमितर्स

6
@DmitryNarkevich, की वजह से बाजीगर setdefaultencoding कार्य करते हैं। इसे पायथन स्टार्टअप पर डिलीट कर दिया गया है क्योंकि इसे कभी भी पहली बार में उचित रिलीज का हिस्सा नहीं होना चाहिए था।
predi

3
इसका मतलब है कि आपने मूल कारण तय नहीं किया है। आपने बस किसी भी रूपांतरित रूपांतरण पर कब्जा कर लिया है
एलेस्टेयर मैककॉर्मैक

5
@miraculixx पायथन 3 की डिफ़ॉल्ट एन्कोडिंग यूटीएफ -8 के साथ यूनिकोड स्ट्रिंग के रूप में डिफ़ॉल्ट है str, इसलिए यह वहां अतिदेय नहीं है। पायथन 2.x में, यूनिकोड संक्रमण की स्थिति में था, इसलिए बाइट्स को यूनिकोड में परिवर्तित करते समय एन्कोडिंग मान लेना खतरनाक होता। इसलिए, ASCII के Py2 की डिफ़ॉल्ट एन्कोडिंग जानबूझकर पसंद थी और डिफ़ॉल्ट एन्कोडिंग को बदलने के लिए पुनः लोड करने के जानबूझकर हैक की आवश्यकता होती है sys। Py2 में एन्कोडिंग त्रुटियों को बंद करने का सही तरीका स्पष्ट रूप से डिकोड करना है और यूनिकोड को स्ट्रिंग्स (बाइट) स्ट्रिंग्स करना है, जब रूपांतरण आवश्यक होते हैं - न कि मान लें कि स्ट्रिंग्स UTF-8 एन्कोडेड हैं।
एलिस्टेयर मैककॉर्मैक

130

यह क्लासिक "यूनिकोड मुद्दा" है। मेरा मानना ​​है कि यह व्याख्या करना एक StackOverflow जवाब के दायरे से परे है कि क्या हो रहा है पूरी तरह से समझाने के लिए।

यह यहाँ अच्छी तरह से समझाया गया है

बहुत संक्षिप्त सारांश में, आपने कुछ ऐसा किया है जिसे बाइट्स के एक स्ट्रिंग के रूप में व्याख्या की जा रही है, जिसे इसे यूनिकोड वर्णों में डिकोड करने की आवश्यकता है, लेकिन डिफ़ॉल्ट कोडेक (ascii) विफल हो रहा है।

प्रस्तुति मैंने आपको इससे बचने के लिए सलाह प्रदान करने के लिए कहा था। अपने कोड को "यूनिकोड सैंडविच" बनाएं। अजगर 2 में, from __future__ import unicode_literalsमदद का उपयोग करता है।

अपडेट: कोड कैसे तय किया जा सकता है:

ठीक है - आपके चर "स्रोत" में आपके पास कुछ बाइट्स हैं। यह आपके प्रश्न से स्पष्ट नहीं है कि वे वहां कैसे पहुंचे - शायद आप उन्हें वेब फॉर्म से पढ़ते हैं? किसी भी मामले में, वे एससीआई के साथ एनकोडेड नहीं हैं, लेकिन अजगर उन्हें यूनिकोड में परिवर्तित करने की कोशिश कर रहे हैं, यह मानते हुए कि वे हैं। आपको यह स्पष्ट रूप से बताने की आवश्यकता है कि एन्कोडिंग क्या है। इसका मतलब है कि आपको यह जानना होगा कि एन्कोडिंग क्या है! यह हमेशा आसान नहीं होता है, और यह पूरी तरह से इस बात पर निर्भर करता है कि यह तार कहाँ से आया है। आप कुछ सामान्य एनकोडिंग के साथ प्रयोग कर सकते हैं - उदाहरण के लिए UTF-8। आप यूनिकोड बताएं () दूसरे पैरामीटर के रूप में एन्कोडिंग:

source = unicode(source, 'utf-8')

1
यह अभी भी सिरदर्द है। GreenAsJade, यू मुझे एक ठोस समाधान दे सकता है?
मछुआरे

1
क्या आप पूछ रहे हैं "मैं इस ब्लॉग के उपयोगकर्ता के रूप में इस समस्या से कैसे बच सकता हूँ?"। या आपका सवाल है "मैं कोड को कैसे ठीक कर सकता हूं ताकि यह समस्या न हो"?
ग्रीनएजजादे

2
mr greenasjade: मुझे "स्रोत = यूनिकोड (स्रोत, 'utf-8')" कहां रखना चाहिए?
मछुआरे

7
अजीब ... एक साल से अधिक सकारात्मक प्रतिक्रिया के बाद, अचानक दो नकारात्मक वोट ... हुह?
ग्रीनएसजेड

11
उपयोग करें currentFile = open(filename, 'rt', encoding='latin1')या currentFile = open(filename, 'rt', encoding='utf-8')यहाँ देखें: stackoverflow.com/a/23917799/2047442
irudyak

42

कुछ मामलों में, जब आप अपने डिफ़ॉल्ट एन्कोडिंग ( print sys.getdefaultencoding()) की जांच करते हैं , तो यह वापस आता है कि आप ASCII का उपयोग कर रहे हैं। यदि आप UTF-8 में बदलते हैं, तो यह आपके चर की सामग्री के आधार पर काम नहीं करता है। मुझे एक और तरीका मिला:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')

ty, इसने मेरी समस्या के लिए python के साथ काम कर रहा है, जो यूनिकोडड्रोस्कोप को फेंक रहा है var = u "" "बड़े स्ट्रिंग में भिन्नता है" "
user2426679

गुण: मॉड्यूल 'sys' में कोई विशेषता नहीं है 'setdefaultencoding'
चैन

और reload(sys)उस विशेष कारण के लिए उपयोग किया जाता है।
मार्सिन ऑर्लोव्स्की

1
मेरे लिए काम किया! धन्यवाद !
Maciej

22

मैं निम्नलिखित त्रुटि संदेश को हल करने के लिए खोज कर रहा था:

यूनिकोडबॉस्फ़ेरर: 'एससीआई' कोडक 0xe2 को 5454 में बाइट को डिकोड नहीं कर सकता: ऑर्डिनल रेंज में नहीं (128)

मैंने अंत में 'एन्कोडिंग' निर्दिष्ट करके इसे ठीक कर लिया:

f = open('../glove/glove.6B.100d.txt', encoding="utf-8")

काश यह आपकी भी मदद कर सकता।


इसे पढ़ने / लिखने के दौरान मेरे लिए त्रुटि हल हो गई।
.SVS फाइलें

मुझे समझ नहीं आता कि अन्य उत्तर इतना अधिक विवरण क्यों प्रदान करते हैं ... लेकिन इस सरल समाधान के बारे में भूल जाते हैं। +10!
stan0

18
"UnicodeDecodeError: 'ascii' codec can't decode byte"

इस त्रुटि के कारण: input_string को यूनिकोड होना चाहिए लेकिन str दिया गया था

"TypeError: Decoding Unicode is not supported"

इस त्रुटि के कारण: यूनिकोड input_string को यूनिकोड में बदलने की कोशिश करना


इसलिए पहले जांचें कि आपका input_string है strऔर यदि आवश्यक हो तो यूनिकोड में परिवर्तित करें:

if isinstance(input_string, str):
   input_string = unicode(input_string, 'utf-8')

दूसरे, ऊपर सिर्फ प्रकार बदलता है लेकिन गैर-असि अक्षर नहीं हटाता है। यदि आप गैर-अस्सी के पात्रों को हटाना चाहते हैं:

if isinstance(input_string, str):
   input_string = input_string.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.

elif isinstance(input_string, unicode):
   input_string = input_string.encode('ascii', 'ignore')

9

मुझे लगता है कि सबसे अच्छा हमेशा यूनिकोड में परिवर्तित होना है - लेकिन यह हासिल करना मुश्किल है क्योंकि व्यवहार में आपको हर फ़ंक्शन के हर तर्क की जांच और रूपांतरण करना होगा जो आप कभी भी लिखते हैं जिसमें कुछ प्रकार के स्ट्रिंग प्रसंस्करण शामिल हैं।

इसलिए मैं निम्नलिखित दृष्टिकोण के साथ या तो इनपुट से यूनिकोड या बाइट स्ट्रिंग्स की गारंटी देता हूं। संक्षेप में, निम्नलिखित लंबों को शामिल करें और उनका उपयोग करें:

# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)

उदाहरण:

text='Some string with codes > 127, like Zürich'
utext=u'Some string with codes > 127, like Zürich'
print "==> with _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> with u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# with % formatting, always use _u() and _uu()
print "Some unknown input %s" % _u(text)
print "Multiple inputs %s, %s" % _uu(text, text)
# but with string.format be sure to always work with unicode strings
print u"Also works with formats: {}".format(_u(text))
print u"Also works with formats: {},{}".format(*_uu(text, text))
# ... or use _u8 and _uu8, because string.format expects byte strings
print "Also works with formats: {}".format(_u8(text))
print "Also works with formats: {},{}".format(*_uu8(text, text))

यहाँ इस बारे में कुछ और तर्क दिए गए हैं ।


नमस्ते, पायथन 3 में फ़ंक्शन _u यह इस मान के साथ काम कर रहा है 'इत्या £'।
मार्टिन

1
ठीक है, जहां आपके "तर्क" पर शुरू करना है? print unicode(u'Zürich', encoding="UTF-8")और फिर शिकायत करें "लेकिन आश्चर्यजनक रूप से आप यूटीएफ 8 में मौजूद यूनिकोड को एनकोड नहीं कर सकते हैं"। unicode()सांकेतिक शब्दों में बदलना नहीं करता; यह डिकोड होता है और आप यूनिकोड को डिकोड नहीं कर सकते हैं - यह पहले से ही डिकोड हो चुका है!
एलेस्टेयर मैककॉर्मैक

@AlastairMcCormack पोस्ट को बेहतर बनाने के लिए आपका स्वागत है। यदि आप अपनी कथित सुपरियरियोरिटी को हर किसी पर छिड़कना पसंद करते हैं जो आपकी राय और अंतर्दृष्टि को साझा नहीं करता है, तो मैं स्पष्ट रूप से दिलचस्पी नहीं लेता हूं। धन्यवाद।
चमत्कारिक

3
@ मिराकुलिक्स मैं क्षमा चाहता हूँ, मुझे एक झटके की तरह आने का मतलब नहीं था। हर बार जब आप अपने कोड में एक स्ट्रिंग का उपयोग करते हैं, तो डिकोडिंग और एन्कोडिंग के बारे में चिंता करना सिर्फ अनावश्यक है।
एलेस्टेयर मैककॉर्मैक

7

एक Ubuntu इंस्टॉलेशन में ऑपरेटिंग सिस्टम स्तर पर इसे हल करने के लिए निम्नलिखित की जाँच करें:

$ locale charmap

अगर तुम्हे मिले

locale: Cannot set LC_CTYPE to default locale: No such file or directory

के बजाय

UTF-8

तब सेट LC_CTYPEऔर LC_ALLइस तरह:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"

6

एनकोड एक स्ट्रिंग ऑब्जेक्ट में यूनिकोड ऑब्जेक्ट को कनवर्ट करता है। मुझे लगता है कि आप एक स्ट्रिंग ऑब्जेक्ट को एनकोड करने की कोशिश कर रहे हैं। पहले अपना परिणाम यूनिकोड ऑब्जेक्ट में बदलें और फिर उस यूनिकोड ऑब्जेक्ट को 'utf-8' में एनकोड करें। उदाहरण के लिए

    result = yourFunction()
    result.decode().encode('utf-8')

4

मुझे भी यही समस्या थी लेकिन यह पायथन 3 के लिए काम नहीं करता था। मैंने इसका अनुसरण किया और इसने मेरी समस्या हल कर दी:

enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)

जब आप फ़ाइल पढ़ / लिख रहे हों, तो आपको एन्कोडिंग सेट करना होगा।


4

एक ही त्रुटि हुई और इससे मेरी त्रुटि हल हो गई। धन्यवाद! अजगर 2 और अजगर 3 यूनिकोड हैंडलिंग में अलग-थलग फाइलों को लोड करने के लिए असंगत बना रहा है। तो अजगर अचार के एन्कोडिंग तर्क का उपयोग करें। नीचे दिए लिंक से मुझे इसी तरह की समस्या को हल करने में मदद मिली जब मैं अपने अजगर 3.7 से पिक डेटा को खोलने की कोशिश कर रहा था, जबकि मेरी फ़ाइल मूल रूप से अजगर 2.x संस्करण में सहेजी गई थी। https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ मैं अपनी स्क्रिप्ट में load_pickle फ़ंक्शन की प्रतिलिपि बनाता हूं और लोड करते समय load_pickle (अचार_फाइल) कहा जाता हूं input_data इस तरह:

input_data = load_pickle("my_dataset.pkl")

Load_pickle फ़ंक्शन यहां है:

def load_pickle(pickle_file):
    try:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f)
    except UnicodeDecodeError as e:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f, encoding='latin1')
    except Exception as e:
        print('Unable to load data ', pickle_file, ':', e)
        raise
    return pickle_data

1
load_pickleअपने उत्तर में फ़ंक्शन की परिभाषा को शामिल करना बेहतर है ।
1919

4

यह मेरे लिए काम किया:

    file = open('docs/my_messy_doc.pdf', 'rb')

3

संक्षेप में, पायथन 2 में उचित यूनिकोड हैंडलिंग सुनिश्चित करने के लिए:

  • उपयोग io.openफ़ाइलों को पढ़ने / लिखने के लिए करें
  • उपयोग from __future__ import unicode_literals
  • यूनिकोड का उपयोग करने के लिए अन्य डेटा इनपुट / आउटपुट (जैसे, डेटाबेस, नेटवर्क) कॉन्फ़िगर करें
  • यदि आप आउटपुट को utf-8 में कॉन्फ़िगर नहीं कर सकते हैं, तो उनके लिए अपना आउटपुट परिवर्तित करें print(text.encode('ascii', 'replace').decode())

स्पष्टीकरण के लिए, @Alastair मैककॉर्मैक का विस्तृत जवाब देखें


io.open(path, 'r', encoding='utf-8')utf-8-encoded फ़ाइलों को पढ़ने के लिए उपयोग करें।
बॉब स्टीन

3

मेरे पास एक ही त्रुटि थी, जिसमें गैर-अस्की चरस वाले URL (मानों के साथ बाइट्स> 128), मेरा समाधान:

url = url.decode('utf8').encode('utf-8')

नोट: utf-8, utf8 केवल उपनाम हैं। केवल 'utf8' या 'utf-8' का उपयोग करके उसी तरह काम करना चाहिए

मेरे मामले, अजगर 2.7 में, मेरे लिए काम किया है, मैं इस काम में 'कुछ' बदल मान लें कि strआंतरिक प्रतिनिधित्व - यानी, उस में समर्थित बाइट क्रम के अधिकार डिकोडिंग बलों urlऔर अंत में एक में स्ट्रिंग डालता utf-8 str के साथ सही जगह पर सभी जादू। पायथन में यूनिकोड मेरे लिए काला जादू है। आशा है कि उपयोगी है


1
क्यों एक में पानी का छींटा और दूसरे में नहीं
इगोरगानोपल्स्की

1
पायथन नामों को एन्कोडिंग के लिए उपनामों को स्वीकार करता है, मैंने अब कोशिश की है, और उसी का प्रदर्शन किया है ... बस मैंने ध्यान नहीं दिया है कि मैंने उन्हें अलग-अलग लिखा है, ध्यान दें
फैबियानो तारालो

2

मुझे स्ट्रिंग "पास्टेलरएला मल्लोर्का" के साथ एक ही समस्या मिली और मैंने इसके साथ हल किया:

unicode("Pastelería Mallorca", 'latin-1')

1

एक Django (1.9.10) / पायथन 2.7.5 परियोजना में मेरे पास लगातार UnicodeDecodeErrorअपवाद हैं; मुख्य रूप से जब मैं यूनिकोड स्ट्रिंग्स को लॉगिंग को खिलाने की कोशिश करता हूं। मैंने मनमाने ढंग से वस्तुओं के लिए एक सहायक कार्य किया, जो मूल रूप से 8-बिट एससिआई स्ट्रिंग्स को प्रारूपित करता है और किसी भी वर्ण को तालिका में नहीं बदलकर '?' करता है। मुझे लगता है कि यह सबसे अच्छा समाधान नहीं है, लेकिन चूंकि डिफ़ॉल्ट एन्कोडिंग ascii है (और मैं इसे बदलना नहीं चाहता) यह करेगा:

def encode_for_log (c, एन्कोडिंग = 'ascii'):
    अगर आइंस्टीन (c, बेसरेस्ट्रिंग):
        वापसी c.encode (एन्कोडिंग, 'बदलें')
    एलिफेंस (c, Iterable):
        c_ = []
        सी में v के लिए:
            c_.append (encode_for_logging (v, एन्कोडिंग))
        वापसी c_
    अन्य:
        वापसी encode_for_log (यूनिकोड (c))
`


1

यह त्रुटि तब होती है जब हमारी स्ट्रिंग में कुछ गैर ASCII वर्ण होते हैं और हम उचित डिकोडिंग के बिना उस स्ट्रिंग पर कोई भी ऑपरेशन कर रहे हैं। इससे मुझे अपनी समस्या हल करने में मदद मिली। मैं कॉलम ID, पाठ और उसमें नीचे डिकोडिंग वर्णों के साथ एक CSV फ़ाइल पढ़ रहा हूं:

train_df = pd.read_csv("Example.csv")
train_data = train_df.values
for i in train_data:
    print("ID :" + i[0])
    text = i[1].decode("utf-8",errors="ignore").strip().lower()
    print("Text: " + text)

0

यहाँ मेरा समाधान है, बस एन्कोडिंग जोड़ें। with open(file, encoding='utf8') as f

और क्योंकि दस्ताने की फाइल को पढ़ने में काफी समय लगेगा, मैं ग्लव फाइल को एक सुपीरियर फाइल की सलाह देता हूं। जब netx समय आप एम्बेडिंग भार पढ़ते हैं, तो यह आपका समय बचाएगा।

import numpy as np
from tqdm import tqdm


def load_glove(file):
    """Loads GloVe vectors in numpy array.
    Args:
        file (str): a path to a glove file.
    Return:
        dict: a dict of numpy arrays.
    """
    embeddings_index = {}
    with open(file, encoding='utf8') as f:
        for i, line in tqdm(enumerate(f)):
            values = line.split()
            word = ''.join(values[:-300])
            coefs = np.asarray(values[-300:], dtype='float32')
            embeddings_index[word] = coefs

    return embeddings_index

# EMBEDDING_PATH = '../embedding_weights/glove.840B.300d.txt'
EMBEDDING_PATH = 'glove.840B.300d.txt'
embeddings = load_glove(EMBEDDING_PATH)

np.save('glove_embeddings.npy', embeddings) 

Gist लिंक: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.