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.


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.


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

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

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 = "ボールト"

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

10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

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

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')
ñ

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.