So konvertieren Sie einen String in Python in utf-8

192

Ich habe einen Browser, der utf-8-Zeichen an meinen Python-Server sendet, aber wenn ich ihn aus der Abfragezeichenfolge abrufe, ist die von Python zurückgegebene Codierung ASCII. Wie kann ich die einfache Zeichenfolge in utf-8 konvertieren?

HINWEIS: Die vom Web übergebene Zeichenfolge ist bereits UTF-8-codiert. Ich möchte Python lediglich dazu bringen, sie als UTF-8 und nicht als ASCII zu behandeln.

Bin Chen
quelle
Versuchen Sie diesen Link http://evanjones.ca/python-utf8.html
Mudassir
Ich denke, ein besserer Titel wäre Wie man einen String ohne Übersetzung zum Unicode zwingt?
Bootscodierer
1
Im Jahr 2018, Python 3, wenn Sie ASCII Decodierungsfehler tun"some_string".encode('utf-8').decode('utf-8')
devssh

Antworten:

265
>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^ Dies ist der Unterschied zwischen einer Byte-Zeichenfolge (plain_string) und einer Unicode-Zeichenfolge.

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^ Konvertieren in Unicode und Festlegen der Codierung.

user225312
quelle
34
Ich erhalte die folgende Fehlermeldung: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteDies ist mein Code: ret = [] für Zeile in csvReader: cline = [] für Ulme in Zeile: unicodestr = unicode (Ulme, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG
102
Nichts davon gilt in Python 3, alle Zeichenfolgen sind Unicode und unicode()existieren nicht.
Noumenon
Irgendwie stoßen, aber danke. Dies behebt ein Problem, bei dem ich versuchte, Unicode zu drucken und s bekam.
7 的 人
Wie konvertiere ich uzurück in ein strFormat (konvertiere uzurück in s)?
Tanguy
3
Dieser Code funktioniert nur, solange der Text keine Nicht-ASCII-Zeichen enthält. Ein einfaches Zeichen mit Akzent auf der Zeichenfolge führt zum Fehlschlagen.
Haroldo_OK
71

Wenn die oben genannten Methoden nicht funktionieren, können Sie Python auch anweisen, Teile einer Zeichenfolge zu ignorieren, die nicht in utf-8 konvertiert werden können:

stringnamehere.decode('utf-8', 'ignore')
duhaime
quelle
6
Got AttributeError: 'str' Objekt hat kein Attribut '
decode
2
@ saran3h Es hört sich so an, als würden Sie Python 3 verwenden. In diesem Fall sollte Python Codierungsprobleme für Sie behandeln. Haben Sie versucht, Ihr Dokument zu lesen, ohne eine Codierung anzugeben?
Duhaime
Python wählt standardmäßig die Systemcodierung aus. In Windows 10 unterscheidet sich cp1252 von utf-8. Ich
habe vor
21

Könnte ein bisschen übertrieben sein, aber wenn ich mit ASCII und Unicode in denselben Dateien arbeite, kann das Wiederholen der Dekodierung schmerzhaft sein. Ich verwende Folgendes:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input
Blueswannabe
quelle
15

Fügen Sie die folgende Zeile oben in Ihre .py-Datei ein:

# -*- coding: utf-8 -*-

Mit dieser Option können Sie Zeichenfolgen direkt in Ihrem Skript codieren:

utfstr = "ボールト"
Ken
quelle
1
Es ist nicht das, was OP verlangt. Aber vermeiden Sie solche String-Literale trotzdem. Es erstellt eine Unicode-Zeichenfolge in Python 3 (gut), ist jedoch ein Bytestring in Python 2 (schlecht). Entweder oben hinzufügen from __future__ import unicode_literalsoder u''Präfix verwenden. Verwenden Sie keine Nicht-ASCII-Zeichen in bytesLiteralen. Um utf-8 Bytes zu erhalten, können Sie utf8bytes = unicode_text.encode('utf-8')später, wenn es notwendig ist.
JFS
1
@jfs Wie kann from __future__ import unicode_literalsich eine Zeichenfolge mit Nicht-ASCII-Zeichen in utf-8 konvertieren?
Ortal Turgeman
@OrtalTurgeman Ich beantworte die Frage nicht. Schau, es ist ein Kommentar, keine Antwort. Mein Kommentar behebt das Problem mit dem Code in der Antwort. Es wird versucht, einen Bytestring mit Nicht-ASCII-Zeichen in Python 2 zu erstellen (es ist ein SyntaxError in Python 3 - Byte-Literale verbieten dies).
JFS
13

Wenn ich Sie richtig verstehe, haben Sie eine utf-8-codierte Byte-Zeichenfolge in Ihrem Code.

Das Konvertieren einer Byte-Zeichenfolge in eine Unicode-Zeichenfolge wird als Decodierung bezeichnet (Unicode -> Byte-Zeichenfolge wird codiert).

Dazu verwenden Sie die Unicode- Funktion oder die Decodierungsmethode . Entweder:

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

Oder:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
Codeape
quelle
10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
Willem
quelle
8

In Python 3.6 ist keine unicode () -Methode integriert. Zeichenfolgen werden standardmäßig bereits als Unicode gespeichert, und es ist keine Konvertierung erforderlich. Beispiel:

my_str = "\u221a25"
print(my_str)
>>> 25
Zld Productions
quelle
3

Übersetzen Sie mit ord () und unichar (). Jedem Unicode-Zeichen ist eine Nummer zugeordnet, so etwas wie ein Index. Python hat also einige Methoden, um zwischen einem Zeichen und seiner Nummer zu übersetzen. Nachteil ist ein Beispiel. Hoffe es kann helfen.

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ
Joe9008
quelle