Ich habe einige Probleme beim Versuch, eine Zeichenfolge in UTF-8 zu codieren. Ich habe zahlreiche Dinge ausprobiert, einschließlich der Verwendung von string.encode('utf-8')
und unicode(string)
, aber ich erhalte den Fehler:
UnicodeDecodeError: Der Codec 'ascii' kann das Byte 0xef an Position 1 nicht dekodieren: Ordnungszahl nicht im Bereich (128)
Das ist meine Zeichenfolge:
(。・ω・。)ノ
Ich sehe nicht, was falsch läuft, eine Idee?
Bearbeiten: Das Problem ist, dass das Drucken der Zeichenfolge so wie sie ist nicht richtig angezeigt wird. Auch dieser Fehler, 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)
Antworten:
Dies hängt damit zusammen, dass die Codierung Ihres Terminals nicht auf UTF-8 eingestellt ist. Hier ist mein Terminal
Auf meinem Terminal funktioniert das Beispiel mit dem oben genannten, aber wenn ich die
LANG
Einstellung los werde, funktioniert es nichtKonsultieren Sie die Dokumente für Ihre Linux-Variante, um herauszufinden, wie Sie diese Änderung dauerhaft vornehmen können.
quelle
sudo apt-get install language-pack-de
odersudo locale-gen de_DE.UTF-8
(für deutsche Ländereinstellungen) aus.LC_ALL
und der einfachste Wert, der sie beheben würde, istC.UTF-8
Versuchen:
bearbeiten:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
gibtu'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, was richtig ist.Ihr Problem muss sich also an einem anderen Ort befinden, möglicherweise wenn Sie versuchen, etwas damit zu tun, wenn eine implizite Konvertierung stattfindet (könnte Drucken, Schreiben in einen Stream sein ...)
Um mehr zu sagen, müssen wir Code sehen.
quelle
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'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
ist utf8-codiert. Wenn Sie es drucken, werden nur die Bytes mit dem Ausgabestream verbunden, und wenn Ihr Terminal es nicht als utf8 interpretiert, entsteht Müll. mitdecode
Sie es in Unicode konvertieren, dann können Sieencode
es wieder eine Codierung Terminal versteht.Mein +1 zum Kommentar von mata unter https://stackoverflow.com/a/10561979/1346705 und zur Demonstration von Nick Craig-Wood. Sie haben die Zeichenfolge korrekt dekodiert. Das Problem liegt beim
print
Befehl, da er die Unicode-Zeichenfolge in die Konsolencodierung konvertiert und die Konsole die Zeichenfolge nicht anzeigen kann. Versuchen Sie, die Zeichenfolge in eine Datei zu schreiben, und sehen Sie sich das Ergebnis mit einem anständigen Editor an, der Unicode unterstützt:Dann wirst du sehen
(。・ω・。)ノ
.quelle
Wenn Sie auf einem Remote- Host arbeiten, schauen Sie
/etc/ssh/ssh_config
auf Ihrem lokalen PC nach.Wenn diese Datei eine Zeile enthält:
Kommentieren Sie es mit dem Hinzufügen
#
am Anfang der Zeile aus. Es könnte helfen.ssh
Sendet mit dieser Zeile sprachbezogene Umgebungsvariablen Ihres PCs an den Remote- Host. Es verursacht viele Probleme.quelle
Versuchen Sie, die Systemstandardcodierung wie
utf-8
zu Beginn des Skripts festzulegen, damit alle Zeichenfolgen damit codiert werden.quelle
Es ist in Ordnung, den folgenden Code oben in Ihrem Skript zu verwenden, wie Andrei Krasutski vorgeschlagen hat.
Ich werde Ihnen jedoch vorschlagen,
# -*- coding: utf-8 -*
ganz oben im Skript eine Zeile hinzuzufügen .Wenn ich es weglasse, wird in meinem Fall der folgende Fehler ausgegeben, wenn ich versuche, ihn auszuführen
basic.py
.Das Folgende ist der vorhandene Code,
basic.py
der den obigen Fehler auslöst.Code mit Fehler
Dann habe ich
# -*- coding: utf-8 -*-
ganz oben eine Zeile hinzugefügt und ausgeführt. Es funktionierte.Code ohne Fehler
Vielen Dank.
quelle
#coding: utf-8
anstatt# -*- coding: utf-8 -*-
dies ist leichter zu merken. Funktioniert sofort mit Python PEP 263 - Definieren von Python-Quellcode-Codierungen .Keine Probleme mit meinem Terminal. Die obigen Antworten haben mir geholfen, in die richtigen Richtungen zu schauen, aber es hat bei mir nicht funktioniert, bis ich hinzugefügt habe
'ignore'
:Wie im Kommentar unten angegeben, kann dies zu unerwünschten Ergebnissen führen. OTOH, es kann auch gerade gut genug sein, um die Dinge zum Laufen zu bringen, und es ist Ihnen egal, ob Sie einige Charaktere verlieren.
quelle
Dies funktioniert für Ubuntu 15.10:
quelle
Es sieht so aus, als ob Ihre Zeichenfolge codiert
utf-8
ist. Was genau ist das Problem? Oder was versuchst du hier zu machen ..?quelle
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
, möchte ich, dass sie ordnungsgemäß codiert wird.In meinem Fall wurde dies dadurch verursacht, dass meine Unicode-Datei mit einer "Stückliste" gespeichert wurde. Um dies zu lösen, habe ich die Datei mit BBEdit aufgebrochen und "Speichern unter ..." ausgewählt, um "Unicode (UTF-8)" zu codieren, und nicht "Unicode (UTF-8, mit Stückliste)". ""
quelle
Ich habe den gleichen Fehlertyp 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.
quelle
Dies ist die beste Antwort: https://stackoverflow.com/a/4027726/2159089
unter Linux:
so
sys.stdout.encoding
ist OK.quelle
Stückliste, es ist so oft Stückliste für mich
vi die Datei verwenden
und speichern Sie es. Das behebt es in meinem Fall fast immer
quelle
Ich hatte den gleichen Fehler mit URLs, die Nicht-ASCII-Zeichen enthielten (Bytes mit Werten> 128).
In Python 2.7 hat diese Zuweisung für mich funktioniert und ich nehme an, dass diese Zuweisung 'etwas' in der
str
internen Darstellung geändert hat - dh sie erzwingt die richtige Dekodierung der gesicherten Bytesequenz inurl
und setzt den String schließlich in eine utf-8str
mit all der Magie in der richtige Ort. Unicode in Python ist für mich schwarze Magie. Hoffe nützlichquelle
Ich löse das Problem, das sich in der Datei settings.py mit 'ENGINE': 'django.db.backends.mysql' ändert. Verwenden Sie nicht 'ENGINE': 'mysql.connector.django',
quelle
Konvertieren Sie den Text einfach explizit in einen String mit
str()
. Hat für mich gearbeitet.quelle