Was ist das u-Präfix in einer Python-Zeichenfolge?

232

Wie in:

u'Hello'

Ich vermute, dass es "Unicode" anzeigt, ist es richtig?

Wenn ja, seit wann ist es verfügbar?

OscarRyz
quelle

Antworten:

147

Sie haben Recht, siehe 3.1.3. Unicode-Zeichenfolgen .

Es ist die Syntax seit Python 2.0.

Python 3 hat sie überflüssig gemacht, da der Standard-Zeichenfolgentyp Unicode ist. Die Versionen 3.0 bis 3.2 haben sie entfernt, aber sie wurden in 3.3+ neu hinzugefügt, um die Kompatibilität mit Python 2 zu gewährleisten und den Übergang von 2 zu 3 zu unterstützen.

Stefan Kendall
quelle
6
Man sollte hinzufügen, dass es in Python 3 nicht mehr notwendig ist, aber immer noch eine gültige Syntax.
Martin Thoma
Das Kombinieren von Unicode + Raw-Zeichenfolgen (Regex) (z. B. ur"string") ist in Python 2 gültig, in Python 3 jedoch leider ungültig.
Cowlinator
123

Das u in u'Some String'bedeutet, dass Ihre Zeichenfolge eine Unicode-Zeichenfolge ist .

F: Ich habe es schrecklich eilig und bin über die Google-Suche hier gelandet. Ich versuche, diese Daten in eine Datei zu schreiben. Ich erhalte eine Fehlermeldung und benötige in dieser Sekunde die einfachste, wahrscheinlich fehlerhafte Lösung.

A: Sie sollten wirklich Joels absolutes Minimum lesen. Jeder Softwareentwickler muss unbedingt einen positiven Aufsatz über Unicode- und Zeichensätze (keine Ausreden!) Über Zeichensätze wissen .

F: sry kein Zeitcode pls

Eine Geldbuße. versuchen Sie es str('Some String')oder 'Some String'.encode('ascii', 'ignore'). Aber Sie sollten wirklich einige der Antworten und Diskussionen zum Konvertieren einer Unicode-Zeichenfolge und dieser hervorragenden, hervorragenden Einführung in die Zeichenkodierung lesen .

Andrew
quelle
6
Dies funktioniert, wenn die Zeichenfolge nur ASCII-Text enthält . In allen anderen Fällen müssen Sie explizit codieren.
Martijn Pieters
2
Dies behandelt das u '' als etwas "loszuwerden". Dies sagt mir, dass Sie nicht wirklich verstehen, was es ist. Im Allgemeinen möchten Sie es nicht nur "loswerden", und die richtige Methode zum Erstellen einer Byte-Zeichenfolge aus einer Unicode-Zeichenfolge hängt davon ab, was diese Zeichenfolge enthält und in welchem ​​Kontext.
Lennart Regebro
2
@LennartRegebro stimmte voll und ganz zu - dies war eine wegwerfbare Antwort, die eine Zunge in der Wange sein sollte, aber eine Art schreckliche Anzahl von Gegenstimmen ansammelte. bearbeitet, um zu versuchen, die Leute in die richtige Richtung zu lenken.
Andrew
1
Das war eine lustige Lektüre! Vielen Dank! Artikel ist 17 Jahre alt und es ist immer noch korrekt. Beeindruckend.
Kerwin Sneijders
52

Ich vermute, dass es "Unicode" anzeigt, ist es richtig?

Ja.

Wenn ja, seit wann ist es verfügbar?

Python 2.x.

In Python 3.x verwenden die Zeichenfolgen standardmäßig Unicode, und das uPräfix ist nicht erforderlich . Hinweis: In Python 3.0-3.2 ist das u ein Syntaxfehler. In Python 3.3+ ist es wieder legal, das Schreiben von 2/3 kompatiblen Apps zu vereinfachen.

kennytm
quelle
4
Es ist sogar ein Syntaxfehler in Python 3, das uPräfix zu verwenden.
Tim Pietzcker
14
@ TimPietzcker: Nur in 3.0-3.2; In Version 3.3+ ist es legal (und bedeutungslos), um das Schreiben von Bibliotheken und Apps mit einer Codebasis von 2.6 + / 3.3 + zu vereinfachen.
Abarnert
@abarnert: Nun, dieser Kommentar ist jetzt viereinhalb Jahre alt :)
Tim Pietzcker
3
@TimPietzcker: Sicher, aber genau wie Ihr Kommentar ein nützlicher Nachtrag für jeden war, der diese nützliche Antwort durch Suche im Jahr 2010 gefunden hat, halte ich es für nützlich, die Änderung in 3.3 gegenüber jedem zu erwähnen, der sie 2014 findet. Es ist möglicherweise besser, die zu bearbeiten Antwort, aber ich denke, es ist ein kleiner Punkt, auf den die meisten Menschen nicht stoßen werden (denn wenn Sie 2014 noch nicht 3.0-3.2 verwenden, ist "keine Notwendigkeit für das Präfix" alles, was Sie wissen müssen).
Abarnert
Wenn Sie Code schreiben, den beliebige Benutzer herunterladen und ausführen können, und die meisten Fälle abdecken möchten, ohne Annahmen zu treffen, ist es hilfreich zu wissen, dass 3.0-3.2 nicht funktioniert. Weil Sie sich entscheiden müssen, ob Sie six.text_type()überall für die (hoffentlich winzige) Anzahl von Personen verwenden möchten, die noch 3 verwenden. [012] - Zumindest die Informationen sind da, so dass Sie wählen können.
Dwanderson
3

Ich bin hierher gekommen, weil ich ein Funny-Char-Syndrom hatte requests. Ich dachte response.text, ich würde eine richtig dekodierte Zeichenfolge erhalten, aber in der Ausgabe fand ich lustige Doppelzeichen, wo deutsche Umlaute hätten sein sollen.

Es stellte sich heraus, dass response.encodinges irgendwie leer war und daher responsenicht wusste, wie man den Inhalt richtig dekodiert und ihn einfach als ASCII behandelte (denke ich).

Meine Lösung bestand darin, die Rohbytes mit 'response.content' abzurufen und manuell darauf anzuwenden decode('utf_8'). Das Ergebnis war schöne Umlaute.

Das richtig dekodiert

Pelz

gegen die falsch entschlüsselt

für

Chris
quelle
2

Alle für Menschen bestimmten Zeichenfolgen sollten u "" verwenden.

Ich habe festgestellt, dass die folgende Denkweise beim Umgang mit Python-Zeichenfolgen sehr hilfreich ist: Alle Python-Manifest-Zeichenfolgen sollten die u""Syntax verwenden. Die ""Syntax gilt nur für Byte-Arrays.

Lassen Sie mich das erklären, bevor das Bashing beginnt. Die meisten Python-Programme beginnen mit der Verwendung ""von Zeichenfolgen. Aber dann müssen sie die Dokumentation aus dem Internet unterstützen, damit sie anfangen zu verwenden, "".decodeund plötzlich bekommen sie überall Ausnahmen über das Dekodieren von diesem und jenem - alles wegen der Verwendung von ""für Zeichenfolgen. In diesem Fall verhält sich Unicode wie ein Virus und verursacht Chaos.

Wenn Sie jedoch meiner Regel folgen, haben Sie diese Infektion nicht (weil Sie bereits infiziert sind).

Frank Krueger
quelle
bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
Kennytm
@KennyTM Hört sich gut an! Einfach gemeint, um zu sagen, dass alle Zeichenfolgen, die für Menschen bestimmt sind, verwendet werden sollten u"".
Frank Krueger
1
Wenn Sie Unicode überall religiös verwenden möchten - was für viele Anwendungen (aber nicht für alle) eine gute Sache ist -, möchten Sie mit ziemlicher Sicherheit Python 3.x und nicht 2.x. Das mag 2010 nicht der Fall gewesen sein, als dies geschrieben wurde, aber 2014 werden die meisten Bibliotheken oder Plattformen, die ein Upgrade auf 3.x verhindern, Sie auch daran hindern, Unicode ordnungsgemäß zu verwenden…
abarnert
1

Es ist Unicode.

Setzen Sie einfach die Variable dazwischen str(), und es wird gut funktionieren.

Falls Sie jedoch zwei Listen wie die folgenden haben:

a = ['co32','co36']
b = [u'co32',u'co36']

Wenn Sie dies überprüfen set(a)==set(b), wird es als "Falsch" angezeigt. Wenn Sie jedoch Folgendes tun:

b = str(b)
set(a)==set(b)

Jetzt ist das Ergebnis wahr.

user3251882
quelle
Gefahr, Gefahr. Sie sollten niemals einen Unicode ( str()oder u'€'.encode()) codieren, ohne eine Codierung zu übergeben. Wenn die Zeichenfolge Nicht-ASCII enthält, erhält der Benutzer eine UnicodeEncodeException.
Alastair McCormack
3
Außerdem funktioniert Ihr Code nicht. b = str(b)gibt nur die Zeichenfolge repr()der Liste, dh b = "[u'co32', u'co36']". Dannset(a)==set(b) = False
Alastair McCormack