Ich weiß, dass Django Unicode-Zeichenfolgen im gesamten Framework anstelle von normalen Python-Zeichenfolgen verwendet. Welche Codierung verwenden normale Python-Zeichenfolgen? und warum benutzen sie nicht Unicode?Welche Codierung verwenden normale Python-Strings?
Antwort
Von Python 3.0 auf alle Zeichenfolgen sind Unicode standardmäßig, gibt es auch den Byte-Datentyp (Python documentation).
Also die Python-Entwickler denken, dass die Verwendung von Unicode ist eine gute Idee, dass es nicht allgemein in Python 2 verwendet wird, ist vor allem aufgrund der Abwärtskompatibilität. Es hat auch Auswirkungen auf die Leistung.
Vor Python 3.0 war die Zeichenfolgencodierung standardmäßig ascii
, konnte jedoch geändert werden. Unicode-Zeichenfolgenliterale waren u"..."
. Das war dumm.
Vielleicht albern, aber notwendig als Zwischenschritt zwischen allen Strings ASCII und alle Zeichenketten UNICODE sein. –
Oh, ich zweifle nicht, dass dies der beste Weg war. Es war nur für die seltsame Situation, in der du alle deine Saiten haben musstest (was die Frage, was die nicht '' '' 'waren, leicht anbettelte)! = p – katrielalex
@ S.Lott, alle Zeichenfolgen sind ASCII beschreibt nicht richtig die Situation, in der Python jemals war. –
Python 2.x-Strings sind 8-Bit, nichts mehr. Die Codierung kann variieren (obwohl ASCII angenommen wird). Ich denke die Gründe sind historisch. Nur wenige Sprachen, insbesondere Sprachen aus dem letzten Jahrhundert, verwenden Unicode sofort.
In Python 3 sind alle Zeichenfolgen Unicode.
Ganz richtig: 'str' hat keine Kodierung, es sind nur Bytes, die für Daten verwendet werden können, die Text jeder Kodierung sind. (Übrigens haben sowohl Python 2 als auch 3 Unicode- und Byte-Strings. In Python 3 sind sie 'str' bzw.' bytes' und in Python2 sind sie 'unicode' bzw. 'str.) –
FWIW Tcl verwendet Unicode intern für alle Strings und dies seit über einem Jahrzehnt (seit Version 8.1, circa 1999). Es gibt keinen Unicode-String-Typ und keinen Unicode-String-Typ, alles ist Unicode. –
@Bryan, In der Tat, und das Problem der Codierung wird auf Kanäle verschoben. Das ist gut und denkbar ein besseres Design, kann aber auch weniger flexibel sein. –
Normale Python-Strings (Python 2.x str
) haben keine Codierung: Sie sind Rohdaten. In Python 3 werden diese als "Bytes" bezeichnet, was eine genaue Beschreibung ist, da sie einfach Sequenzen von Bytes sind, die in beliebige Kodierung kodiert werden können (mehrere sind üblich!) Oder nicht-textuelle Daten insgesamt.
Für die Darstellung Text, möchten Sie Unicode-Strings, nicht Byte-Strings. Mit "Unicode-Strings" meine ich unicode
Instanzen in Python 2 und str
Instanzen in Python 3. Unicode-Strings sind Sequenzen von Unicode-Codepoints, die abstrakt ohne eine Codierung dargestellt werden; Dies ist gut geeignet für die Darstellung von Text.
Bytestrings sind wichtig, um Daten für die Übertragung über ein Netzwerk oder das Schreiben in eine Datei oder was auch immer darzustellen, können Sie keine abstrakte Darstellung von Unicode haben, benötigen Sie eine konkrete Darstellung von Bytes. Obwohl sie oft verwendet werden, um Text zu speichern und darzustellen, ist dies zumindest ein wenig unartig.
Diese ganze Situation durch die Tatsache erschwert, dass, während Sie sollte wiederum Unicode in Bytes Python wird versuchen, durch encode
Aufruf und schalten Bytes in Unicode mit decode
, dies für Sie automatisch zu tun, um eine globale Codierung Sie, dass festlegen ist standardmäßig ASCII, was die sicherste Wahl ist. Verlassen Sie sich nie auf Ihren Code und ändern Sie ihn niemals in eine flexiblere Codierung - dekodieren Sie explizit, wenn Sie eine Bytefolge erhalten, und kodieren Sie, wenn Sie eine Zeichenfolge irgendwo extern senden müssen.
Hey! Ich würde gerne ein paar Zeug zu anderen Antworten hinzufügen, leider habe ich noch nicht genug rep, um das richtig zu tun :-(
FWIW, Mike Graham Post ist ziemlich gut und das ist wahrscheinlich das, was Sie zuerst lesen sollten.
Hier einige Kommentare.
- Die Notwendigkeit Unicode-Literale mit "u" in 2.x Präfix ziemlich leicht in der letzten (2.6+) 2.x Pythons entfernt
from __future__ import unicode_literals
- Simialrly, ASCII ist nur die Standardquellencodierung.Python versteht eine Vielzahl von Codierungshinweisen, einschließlich des Emacs-Stils
# -*- coding: utf-8 -*-
. Für weitere Informationen siehe PEP 0263. Das Ändern der Quellencodierung wirkt sich darauf aus, wie Unicode-Literale (unabhängig von ihrem Präfix oder fehlenden Präfix, wie von Punkt 1 betroffen) interpretiert werden. In Py3k ist die Standardkodierung UTF-8. - Python verwendet natürlich intern eine Kodierung für Unicode-Strings (
str
in py3k,unicode
in 2.x), weil zu einem bestimmten Zeitpunkt Dinge in den Speicher geschrieben werden müssen. Idealerweise würde dies für den Endnutzer niemals offensichtlich sein. Leider ist nichts perfekt und man kann gelegentlich Probleme damit bekommen: speziell wenn man funky Squiggles außerhalb der Unicode Base Multilingual Plane verwendet. Seit Python 2.2 hatten wir, was Wide Builds und Narrow baut; Diese Namen beziehen sich auf den Typ, der intern zum Speichern von Unicode-Codepunkten verwendet wird. Wide Builds verwenden UCS-4, das 4 Byte zum Speichern eines Unicode-Codepunkts verwendet. (Dies bedeutet, UCS-4-Code-Einheit Größe ist 4 Bytes oder 32 Bits.) Schmale Builds verwenden UCS-2. UCS-2 hat nur 16 Bits und kann daher nicht alle Unicode-Codepunkte genau codieren (es ist wie UTF-16, außer ohne die Ersatzpaare). Überprüfen Sie den Wert vonsys.maxunicode
. Wenn es1114111
ist, haben Sie einen breiten Build (der alle Unicode korrekt darstellen kann). Wenn es weniger ist, nun, ärgern Sie sich nicht allzu sehr. Der BMP (Codestellen0x0000
bis0xFFFF
) deckt die Bedürfnisse der meisten Menschen ab. Weitere Informationen finden Sie unter PEP 0261.
* Narrow * Builds verwenden UTF-16 (beachten Sie auch, dass UCS-2 und UTF-16 in Wikipedia als Synonyme gelten; ich habe geglaubt, dass sie anders sind, genau wie Sie), mit Ersatzpaaren und allem. Siehe hier: http://codepad.org/RjuAeWFK. Also editieren Sie bitte Ihre Antwort. – tzot
Huh? Die Wikipedia-Seite sagt, dass sie * nicht * äquivalent sind. In der Tat stellt es ausdrücklich fest, dass der Unterschied darin besteht, dass es eine feste Breite hat und keine Ersatzpaare unterstützt (das sagt das Gleiche zweimal). Zitat von dort: Der ältere UCS-2-Standard (2-Byte-Universalzeichensatz) ist eine ähnliche Zeichencodierung, die in Unicode-Version 2.0 durch UTF-16 ersetzt wurde, obwohl sie weiterhin verwendet wird. UCS-2 ist eine feste Länge und kodiert immer Zeichen in eine einzige 16-Bit-Code-Einheit. Es unterstützt keine Ersatzpaare und kann nur Zeichen im BMP-Bereich U + 0000 bis U + FFFF codieren. – lvh
Zweiter Kommentar, weil ich nicht in einem passen konnte. Obwohl UCS-2 und UTF-16 * eindeutige Dinge sind, ist es nicht ganz klar, was Python intern in engen Builds verwendet. Zitat von Thomas Wouters: 01:57
welche Codierung sind normale Python Strings benutzen?
In Python 3.x
str
ist Unicode. Dies kann entweder UTF-16 oder UTF-32 sein, je nachdem, ob Ihr Python-Interpreter mit "schmalen" oder "breiten" Unicode-Zeichen erstellt wurde.
Die Windows-Version von CPython verwendet UTF-16. Auf Unix-ähnlichen Systemen ist UTF-32 tendenziell bevorzugt.
In Python 2.x
str
ist ein String Typenbyte wie C char
. Die Codierung wird nicht von der Sprache definiert, sondern von der Standardcodierung Ihres Gebietsschemas. Oder was auch immer der MIME-Zeichensatz des Dokuments ist, das du aus dem Internet geholt hast. Oder, wenn Sie eine Zeichenfolge von einer Funktion wie struct.pack
erhalten, ist es binäre Daten, und hat keine sinnvolle Zeichencodierung überhaupt.
unicode
Zeichenfolgen in 2.x entsprechen str
in 3.x.
und warum verwenden sie nicht Unicode?
Weil Python (geringfügig) Unicode vorausgeht. Und weil Guido alle wichtigen rückwärtskompatiblen Änderungen für 3.0 speichern wollte. Zeichenfolgen in 3.x Do verwenden standardmäßig Unicode.
Wofür ist der Downvote? – dan04
-1 "Unter Windows sind Strings immer UTF-16" ist absolut codswallop. Sie meinen etwas wie: Windows CPython-Binärdateien werden normalerweise als eine "enge" (16-Bit) Unicode-Implementierung mit minimaler Unterstützung durch Surrogate für Codepunkte außerhalb des BMP bereitgestellt. Man kann eine "breite" (32-Bit) exe kompilieren, falls erforderlich. Python 2.6: Ihr Rant bezieht sich auf "str" Objekte und ignoriert vollständig "Unicode" Objekte. –
Nun, das OP * hat * speziell nach "normalen" Strings gefragt. – dan04
- 1. UrlEncoding - welche Codierung sollte ich verwenden?
- 2. Welche normale Form verwendet Laravel's Eloquent?
- 3. Welche Codierung mit rohen Bytes in einem NSString zu verwenden
- 4. Cross-Plattform-Unicode in C/C++: Welche Codierung zu verwenden?
- 5. Welche Codierung verwendet std :: string.c_str()?
- 6. In welche Codierung konvertiert c32romb?
- 7. Welche Art von Codierung ist das?
- 8. Welche Codierung wird für SAML-Konversationen verwendet?
- 9. Welche Art von Codierung ist diese Zeichenfolge?
- 10. Welche Codierung wird vom HTTP-Protokoll verwendet?
- 11. Datenstrukturen - wann welche verwenden?
- 12. Welche Technologien verwenden?
- 13. Welche jpcap-Bibliothek verwenden?
- 14. Welche Tabellen verwenden Änderungsverfolgung
- 15. Welche generische Sammlung verwenden?
- 16. Welche Sortiermethode verwenden Sie?
- 17. strlen, mb_strlen, welche verwenden?
- 18. Welche HTTP-Methode verwenden?
- 19. SAL-Annotationen, welche verwenden?
- 20. Welche Algorithmen verwenden RDBMS?
- 21. CSV anhängende normale Zeichenfolge/Textzeile
- 22. So verwenden Sie Codierung in Supercsv GetHeader
- 23. Sollten wir Codierung für HtmlString verwenden?
- 24. Wie ReadAllText verwenden, wenn Datei-Codierung unbekannt
- 25. Welche Codierung wird von CSV.DictReader beim Lesen von CSV verwendet?
- 26. Welche Codierung muß ich diese AES128 Daten entschlüsseln
- 27. Normale pro Index?
- 28. Welche Technologie für eine RIA verwenden?
- 29. CKEditor - drehen HTML-Codierung
- 30. OpenGL-Normale funktionieren nicht?
Python 2 und Python 3 haben genau die gleiche Unicode-Unterstützung und beide haben zwei Stringtypen mit der gleichen Semantik wie die beiden anderen. –
Die Standardeinstellung wurde jedoch in Unicode-Zeichenfolgen geändert. Das war das einzige, was ich sagen wollte (etwas zweideutig, ich gestehe). –
Die Syntax wurde geändert, damit Unicode-Literale kein Zeichen vor ihren Anführungszeichen und Bytestrings hatten, richtig. –