it-swarm.com.de

UnicodeDecodeError: Codec 'ascii' kann das Byte 0xef in Position 1 nicht decodieren

Ich habe einige Probleme mit dem Versuch, eine Zeichenfolge in UTF-8 zu kodieren. Ich habe zahlreiche Dinge ausprobiert, unter anderem mit string.encode('utf-8') und unicode(string), aber ich erhalte die Fehlermeldung:

UnicodeDecodeError: Codec 'ascii' kann Byte 0xef in Position 1 nicht decodieren: Ordinalzahl nicht im Bereich (128)

Das ist meine Saite:

(。・ω・。)ノ

Ich verstehe nicht, was los ist, eine Idee?

Bearbeiten: Das Problem ist, dass das Drucken der Zeichenfolge nicht korrekt angezeigt wird. Auch diese Fehlermeldung, wenn ich versuche, es zu konvertieren:

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)
94
Markum

Dies liegt daran, dass die Codierung Ihres Terminals nicht auf UTF-8 eingestellt ist. Hier ist mein Terminal

$ 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
(。・ω・。)ノ
>>> 

Auf meinem Terminal funktioniert das Beispiel mit dem oben genannten, aber wenn ich die Einstellung LANG los bin, funktioniert es nicht

$ 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)
>>> 

Lesen Sie die Dokumente zu Ihrer Linux-Variante, um zu erfahren, wie Sie diese Änderung dauerhaft machen können.

69
Nick Craig-Wood

versuchen:

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

bearbeiten:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8') gibt u'(\uff61\uff65\u03c9\uff65\uff61)\uff89' an, was korrekt ist.

ihr Problem muss also an einem anderen Ort sein. Wenn Sie versuchen, etwas dagegen zu unternehmen, wäre eine implizite Konvertierung im Gange (es könnte gedruckt werden, in einen Stream schreiben ...).

um mehr zu sagen, müssen wir etwas Code sehen.

23
mata

Mein +1 zu matas Kommentar unter https://stackoverflow.com/a/10561979/1346705 und zur Demonstration von Nick Craig-Wood. Sie haben die Zeichenfolge richtig entschlüsselt. Das Problem liegt beim Befehl print, da der Unicode-String in die Konsolencodierung konvertiert wird und die Konsole den String nicht anzeigen kann. Versuchen Sie, den String in eine Datei zu schreiben, und betrachten Sie das Ergebnis mit einem anständigen Editor, der Unicode unterstützt:

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()

Dann sehen Sie (。・ω・。)ノ.

20
pepr

Wenn Sie an einem remote - Host arbeiten, schauen Sie sich /etc/ssh/ssh_config auf Ihrem local - PC an.

Wenn diese Datei eine Zeile enthält:

SendEnv LANG LC_*

kommentieren Sie es aus, indem Sie # am Zeilenanfang hinzufügen. Es könnte helfen.

Mit dieser Zeile sendet ssh sprachbezogene Umgebungsvariablen Ihres PCs an den remote - Host. Es verursacht viele Probleme.

8
Tsutomu

Legen Sie die Standardcodierung des Systems am Anfang des Skripts als utf-8 fest, sodass alle Zeichenfolgen damit kodiert werden.

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

Keine Probleme mit meinem Terminal. Die obigen Antworten haben mir geholfen, in die richtigen Richtungen zu schauen, aber es funktionierte nicht für mich, bis ich 'ignore' hinzugefügt habe:

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

Wie in dem Kommentar unten angegeben, kann dies zu unerwünschten Ergebnissen führen. OTOH kann den Trick auch gut genug machen, um die Dinge zum Laufen zu bringen, und es ist Ihnen egal, ob Sie einige Charaktere verlieren.

4
guaka

Es ist in Ordnung, den folgenden Code oben in Ihrem Skript zu verwenden, als Andrei Krasutski vorgeschlagen.

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

Aber ich schlage vor, dass Sie # -*- coding: utf-8 -*-Zeile ganz oben im Skript hinzufügen.

Wenn ich es versuche, basic.py auszuführen, gibt es in meinem Fall einen Fehler aus.

$ 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

Das Folgende ist der Code, der in basic.py vorhanden ist und einen Fehler auslöst.

code mit Fehler

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 __== '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

Dann habe ich # -*- coding: utf-8 -*- Zeile ganz oben hinzugefügt und ausgeführt. Es funktionierte.

code ohne Fehler

# -*- 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 __== '__main__':
    # Basic document
    doc = Document('basic')
    fill_document(doc)

Vielen Dank.

2
hygull

Es sieht so aus, als wäre Ihr String in utf-8 codiert. Was genau ist das Problem? Oder was versuchst du hier?

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
wim

In meinem Fall wurde es dadurch verursacht, dass meine Unicode-Datei mit einer "Stückliste" gespeichert wurde. Um dieses Problem zu lösen, habe ich die Datei mit BBEdit geöffnet und ein "Speichern unter ..." -Programm gewählt, wobei "Unicode (UTF-8)" codiert wurde und nicht was mit "Unicode (UTF-8, with BOM) "

1
user336828

dies funktioniert für Ubuntu 15.10:

Sudo locale-gen "en_US.UTF-8"
Sudo dpkg-reconfigure locales
1
wlredeye

BOM, es ist so oft BOM für mich

vi die Datei verwenden

:set nobomb

und speichern Sie es. Das behebt das fast immer in meinem Fall

0
Olly W

Ich habe dieselbe Art von Fehler erhalten und festgestellt, dass die Konsole die Zeichenfolge nicht in einer anderen Sprache anzeigen kann. Daher habe ich die folgenden Codeänderungen vorgenommen, um default_charset als UTF-8 festzulegen. 

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 ])
0
Azam Khan