2010-08-23 6 views

Antwort

1

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.

+1

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. –

+0

Die Standardeinstellung wurde jedoch in Unicode-Zeichenfolgen geändert. Das war das einzige, was ich sagen wollte (etwas zweideutig, ich gestehe). –

+1

Die Syntax wurde geändert, damit Unicode-Literale kein Zeichen vor ihren Anführungszeichen und Bytestrings hatten, richtig. –

-1

Vor Python 3.0 war die Zeichenfolgencodierung standardmäßig ascii, konnte jedoch geändert werden. Unicode-Zeichenfolgenliterale waren u"...". Das war dumm.

+1

Vielleicht albern, aber notwendig als Zwischenschritt zwischen allen Strings ASCII und alle Zeichenketten UNICODE sein. –

+0

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

+1

@ S.Lott, alle Zeichenfolgen sind ASCII beschreibt nicht richtig die Situation, in der Python jemals war. –

2

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.

+1

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.) –

+0

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. –

+0

@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. –

26

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.

13

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.

  1. 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
  2. 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.
  3. 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 von sys.maxunicode. Wenn es 1114111 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 (Codestellen 0x0000 bis 0xFFFF) deckt die Bedürfnisse der meisten Menschen ab. Weitere Informationen finden Sie unter PEP 0261.
+1

* 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

+2

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

+3

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 gut, es heißt UCS-2, weil es die Surrogate nicht als ein einzelnes Zeichen behandelt ... aber es ist auch UTF-16, weil es * hat * surrogate :) - Das Verhalten Sie sehen, ist eine Folge von letzterem. – lvh

2

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.

+0

Wofür ist der Downvote? – dan04

+1

-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. –

+0

Nun, das OP * hat * speziell nach "normalen" Strings gefragt. – dan04