यूनिकोडडॉफॉर्सेट: 'एससीआई' कोडेक स्थिति 1 में बाइट 0xef को डिकोड नहीं कर सकता है


106

मैं कुछ मुद्दों पर UTF-8 को एक स्ट्रिंग सांकेतिक शब्दों में बदलना करने की कोशिश कर रहा हूँ। मैंने कई चीजों की कोशिश की है, जिनमें से उपयोग करना string.encode('utf-8')और unicode(string), लेकिन मुझे त्रुटि मिलती है:

यूनिकोडडॉफॉर्सेट: 'एससीआई' कोडक 0xef को स्थिति 1 में बाइट डिकोड नहीं कर सकता है: क्रमिक सीमा में नहीं (128)

यह मेरी स्ट्रिंग है:

(。・ω・。)ノ

मुझे नहीं पता कि क्या गलत हो रहा है, कोई विचार?

संपादित करें: समस्या यह है कि स्ट्रिंग को प्रिंट करना क्योंकि यह ठीक से दिखाई नहीं देता है। इसके अलावा, यह त्रुटि जब मैं इसे बदलने की कोशिश करता हूं:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)

यह सिर्फ एक सामान्य रूप से डाला स्ट्रिंग है। ऐसा ही तब होता है जब मैं इसे छापने की कोशिश करता हूं।
मार्क्युम

मैं वही मिलता हूं जब पाइप स्थापित होता है, और इसे यहां से ठीक करें: [कुछ devel स्थापित करें] [1] [१]: stackoverflow.com/questions/17931726/…
BollMose

जवाबों:


70

यह आपके टर्मिनल के एन्कोडिंग के साथ UTF-8 पर सेट नहीं होने के कारण है। यहाँ मेरा टर्मिनल है

$ echo $LANG
en_GB.UTF-8
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> 

मेरे टर्मिनल पर उदाहरण ऊपर के साथ काम करता है, लेकिन अगर मैं LANGसेटिंग से छुटकारा पा लेता हूं तो यह काम नहीं करेगा

$ unset LANG
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>> 

इस परिवर्तन को स्थायी बनाने के तरीके के बारे में जानने के लिए अपने लिनक्स संस्करण के लिए डॉक्स से परामर्श करें।


1
गुम स्थान भी एक कारण हो सकता है। उन्हें चलाने sudo apt-get install language-pack-deया sudo locale-gen de_DE.UTF-8(जर्मन स्थानों के लिए) स्थापित करने के लिए।
गैर

मेरे लिए, लापता पर्यावरण चर है LC_ALL, और इसे ठीक करने का सबसे सरल मूल्य हैC.UTF-8
रॉबिन विंसलो

24

प्रयत्न:

string.decode('utf-8')  # or:
unicode(string, 'utf-8')

संपादित करें:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')देता है u'(\uff61\uff65\u03c9\uff65\uff61)\uff89', जो सही है।

इसलिए आपकी समस्या कुछ ओटेरिक स्थान पर होनी चाहिए, संभवतः यदि आप इसके साथ कुछ करने की कोशिश करते हैं तो एक निहित रूपांतरण हो रहा है (मुद्रण हो सकता है, एक स्ट्रीम पर लिख रहा है ...)

अधिक कहने के लिए हमें कुछ कोड देखने होंगे।


दोनों लौटते हैंUnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
मार्क्युम

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
मार्क्युम

1
मैं जो करने की कोशिश कर रहा हूं, वह मूल स्ट्रिंग को उसके मूल प्रारूप में प्रिंट करता है, लेकिन मुझे मिलता है (´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
मार्क्युम

4
stringUTF8 एन्कोड है। यदि आप इसे प्रिंट करते हैं, तो यह केवल आउटपुट स्ट्रीम पर बाइट्स को मिटाता है, और यदि आपका टर्मिनल इसे utf8 के रूप में व्याख्या नहीं करता है तो आप कचरे के साथ समाप्त हो जाते हैं। जब decodeआप इसे यूनिकोड में परिवर्तित करते हैं, तो आप encodeइसे फिर से अपने एन्कोडिंग को समझने के लिए कर सकते हैं।
माता

21

Https://stackoverflow.com/a/10561979/1346705 पर और निक क्रेग-वुड के प्रदर्शन के लिए मेरी +1 की टिप्पणी । आपने स्ट्रिंग को सही ढंग से डिकोड किया है। समस्या printकमांड के साथ है क्योंकि यह यूनिकोड स्ट्रिंग को कंसोल एन्कोडिंग में परिवर्तित करता है, और कंसोल स्ट्रिंग को प्रदर्शित करने में सक्षम नहीं है। स्ट्रिंग को एक फ़ाइल में लिखने की कोशिश करें और यूनिकोड का समर्थन करने वाले कुछ सभ्य संपादक का उपयोग करके परिणाम देखें:

import codecs

s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s.decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()

तब आप देखेंगे (。・ω・。)ノ


10

यदि आप दूरस्थ होस्ट पर काम कर रहे हैं , तो /etc/ssh/ssh_configअपने स्थानीय पीसी को देखें।

जब इस फ़ाइल में एक पंक्ति होती है:

SendEnv LANG LC_*

इसे #लाइन के प्रमुख के साथ जोड़कर टिप्पणी करें । यह मदद कर सकता है।

इस पंक्ति के साथ, sshअपने पीसी के भाषा संबंधी पर्यावरण चर को दूरस्थ होस्ट में भेजता है । यह बहुत सारी समस्याओं का कारण बनता है।


धन्यवाद! इन समस्याओं को हल किया जो मैंने ansible और योनि के साथ पाइप पैकेज स्थापित किया था
Maritza Esparza

10

utf-8स्क्रिप्ट की शुरुआत में सिस्टम डिफॉल्ट एन्कोडिंग सेट करने का प्रयास करें , ताकि सभी स्ट्रिंग्स का उपयोग करके इनकोड किया जाए।

# coding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

हमें इस मामले में पुनः लोड की आवश्यकता क्यों है?
फालिंगडॉग

यह यहां वर्णित के रूप में पायथन 3 में काम नहीं करता है । मेरे लिए, नीचे Tsutomu के जवाब ने चाल चली।
पीयूष गोयल

5

आपकी स्क्रिप्ट के शीर्ष में नीचे दिए गए कोड का उपयोग करना ठीक है क्योंकि आंद्रेई कर्सुट्स्की ने सुझाव दिया था।

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

लेकिन मैं आपको # -*- coding: utf-8 -*स्क्रिप्ट के शीर्ष पर लाइन जोड़ने का सुझाव दूंगा ।

जब मैं निष्पादित करने की कोशिश करता हूं, तो इसे छोड़ देना मेरे मामले में त्रुटि से कम है basic.py

$ python basic.py
  File "01_basic.py", line 14
SyntaxError: Non-ASCII character '\xd9' in file basic.py on line 14, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

निम्नलिखित कोड मौजूद है basic.pyजिसमें त्रुटि से ऊपर फेंकता है।

त्रुटि के साथ कोड

from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def fill_document(doc):
    with doc.create(Section('ِش سثؤفهخى')):
        doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
        doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))

        with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
            doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')


if __name__ == '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

फिर मैंने # -*- coding: utf-8 -*-लाइन को बहुत ऊपर से जोड़ा और निष्पादित किया। इसने काम कर दिया।

त्रुटि के बिना कोड

# -*- coding: utf-8 -*-
from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def fill_document(doc):
    with doc.create(Section('ِش سثؤفهخى')):
        doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
        doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))

        with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
            doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')


if __name__ == '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

धन्यवाद।


1
#coding: utf-8इसके बजाय का उपयोग करना # -*- coding: utf-8 -*- याद रखना आसान है। अजगर पीईपी 263 के साथ बॉक्स से बाहर काम करता है - पायथन स्रोत कोड एन्कोडिंग को परिभाषित करना
आंद्रेई कर्सुटस्की

सलाह के लिये धन्यवाद। मेरे अंत में प्रयास करेंगे और उत्तर में इसे अपडेट करेंगे।
हाईगुल

4

मेरे टर्मिनल के साथ कोई समस्या नहीं है। उपर्युक्त उत्तरों ने मुझे सही दिशाओं में देखने में मदद की, लेकिन जब तक मैंने इसे नहीं जोड़ा मेरे लिए यह काम नहीं किया 'ignore':

fix_encoding = lambda s: s.decode('utf8', 'ignore')

जैसा कि नीचे टिप्पणी में संकेत दिया गया है, इससे अवांछित परिणाम हो सकते हैं। OTOH यह भी काम करने के लिए बस चाल काफी अच्छी कर सकता है और आप कुछ पात्रों को खोने के बारे में परवाह नहीं करते हैं।


2
यह गलत है, आप एन्कोडिंग को अनदेखा करने के लिए अपने एन्कोडिंग लैम्ब्डा फ़ंक्शन को मजबूर कर रहे हैं जिसका अर्थ है कि आप वर्ण खो रहे हैं।
मैक्सिमिलियानो रियोस

2
इससे मेरी समस्या हल हो गई, जहां मुझे मूल एन्कोडिंग का पता नहीं था और मुझे कुछ पात्रों को खोने की परवाह नहीं थी।
एडहॉलर

2

ubuntu 15.10 के लिए यह काम करता है:

sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales

1

ऐसा लगता है कि आपका स्ट्रिंग एन्कोडेड है utf-8, तो वास्तव में समस्या क्या है? या आप यहाँ क्या करने की कोशिश कर रहे हैं ..?

Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> s2 = u'(。・ω・。)ノ'
>>> s2 == s1
True
>>> s2
u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'

मूल स्ट्रिंग को प्रिंट करना जैसा कि देता है (´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë, मैं चाहता हूं कि यह ठीक से एनकोड करे।
मार्क्युम

1

मेरे मामले में, यह मेरी यूनिकोड फ़ाइल को "BOM" के साथ सहेजे जाने के कारण हुआ। इसे हल करने के लिए, मैंने BBEdit का उपयोग करते हुए फ़ाइल को खोला और "यूनिकोड (UTF-8)" को एन्कोडिंग के लिए चुनते हुए "Save as ..." किया और न कि यह किसके साथ आया था "Unicode (UTF-8, BOM के साथ) "


0

मुझे उसी प्रकार की त्रुटि मिल रही थी, और मैंने पाया कि कंसोल किसी अन्य भाषा में स्ट्रिंग प्रदर्शित करने में सक्षम नहीं है। इसलिए मैंने डिफ़ॉल्ट कोड को UTF-8 के रूप में सेट करने के लिए नीचे दिए गए कोड परिवर्तन किए।

data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')]
default_charset = 'UTF-8' #can also try 'ascii' or other unicode type
print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ])


-1

BOM, यह मेरे लिए अक्सर BOM है

vi फ़ाइल का उपयोग करें

:set nobomb

और इसे बचाओ। यह लगभग हमेशा मेरे मामले में इसे ठीक करता है


-1

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

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

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


-2

मैं उस समस्या को हल कर रहा हूँ जो 'इंजिन' के साथ फाइल सेटिंग्स में बदल रही है: 'django.db.backends.mysql', 'इंजिन' का उपयोग न करें: 'mysql.connector.django',


@rayryeng क्या आप अपने संपादन का कारण बता सकते हैं? यह एक विशेष सेटिंग की सिफारिश करने से लेकर इसके खिलाफ सिफारिश करने तक, ओपी ने जो लिखा है, उसका अर्थ पूरी तरह से बदल जाता है।
कोई भी

@AndrewMedico - मेरी क्षमायाचना। मैंने देखा कि यह पोस्ट एक दूसरे से बहुत मिलती-जुलती थी इसलिए मुझे विश्वास था कि वे एक ही हैं। मैं वापस पलट दूंगा।
रेयरेंग

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