Frage

Ich bin über diese Passage in der gestolpert Django-Tutorial:

Django-Modelle haben eine Standardeinstellung str() Methode, die aufruft Unicode() und wandelt das Ergebnis in einen UTF-8-Bytestring um.Das bedeutet, dass unicode(p) einen Unicode-String zurückgibt und str(p) einen normalen String mit UTF-8-codierten Zeichen zurückgibt.

Nun bin ich verwirrt, weil Unicode afaik keine bestimmte Darstellung ist. Was ist also ein „Unicode-String“ in Python?Bedeutet das UCS-2?Googeln ist aufgetaucht dieses „Python-Unicode-Tutorial“ was kühn heißt

Unicode ist eine Zwei-Byte-Kodierung, die alle weltweit gängigen Schriftsysteme abdeckt.

was ist einfach falsch, oder doch?Ich war schon oft wegen Zeichensatz- und Codierungsproblemen verwirrt, aber hier bin ich mir ziemlich sicher, dass die Dokumentation, die ich lese, verwirrt ist.Weiß jemand, was in Python passiert, wenn es mir einen „Unicode-String“ gibt?

War es hilfreich?

Lösung

Was ist ein „Unicode-String“ in Python?Bedeutet das UCS-2?

Unicode-Zeichenfolgen in Python werden intern entweder als UCS-2 (16-Bit-Darstellung mit fester Länge, fast identisch mit UTF-16) oder UCS-4/UTF-32 (32-Bit-Darstellung mit fester Länge) gespeichert.Es handelt sich um eine Option zur Kompilierungszeit.Unter Windows ist es immer UTF-16, während viele Linux-Distributionen UTF-32 („Wide-Modus“) für ihre Python-Versionen festlegen.

Im Allgemeinen sollte es Ihnen egal sein:Sie sehen Unicode-Codepunkte als einzelne Elemente in Ihren Zeichenfolgen und wissen nicht, ob sie als zwei oder vier Bytes gespeichert sind.Wenn Sie sich in einem UTF-16-Build befinden und Zeichen außerhalb der Basic Multilingual Plane verarbeiten müssen, machen Sie es falsch, aber das kommt immer noch sehr selten vor, und Benutzer, die die zusätzlichen Zeichen wirklich benötigen, sollten breite Builds kompilieren.

einfach falsch, oder?

Ja, es ist völlig falsch.Um fair zu sein, denke ich, dass das Tutorial ziemlich alt ist.es ist wahrscheinlich älter als breite Unicode-Zeichenfolgen, wenn nicht sogar Unicode 3.1 (die Version, die Zeichen außerhalb der Basic Multilingual Plane einführte).

Eine weitere Quelle der Verwirrung ergibt sich aus der Gewohnheit von Windows, den Begriff „Unicode“ insbesondere für die UTF-16LE-Kodierung zu verwenden, die NT intern verwendet.Leute aus Microsoftland kopieren diese etwas irreführende Angewohnheit oft.

Andere Tipps

In der Zwischenzeit habe ich eine verfeinerte Recherche durchgeführt, um zu überprüfen, wie die interne Darstellung in Python aussieht und wo ihre Grenzen liegen."Die Wahrheit über Unicode in Python„ ist ein sehr guter Artikel, der direkt von den Python-Entwicklern zitiert.Anscheinend ist die interne Darstellung entweder UCS-2 oder UCS-4, abhängig von einem Schalter zur Kompilierungszeit.Also Jon, es ist nicht UTF-16, aber deine Antwort hat mich trotzdem auf den richtigen Weg gebracht, danke.

Python speichert Unicode als UTF-16.str() gibt die UTF-8-Darstellung der UTF-16-Zeichenfolge zurück.

Aus Wikipedia zu UTF-8:

UTF-8 (8-Bit UCS/Unicode Transformation Format) ist ein Zeichenkodierung variabler Länge für Unicode.Es kann jedes Zeichen im Unicode-Standard darstellen, dennoch ist die anfängliche Kodierung von Bytecodes und Zeichenzuweisungen für UTF-8 abwärtskompatibel mit ASCII.Aus diesen Gründen wird es immer mehr zur bevorzugten Kodierung für E-Mails, Webseiten[1] und andere Orte, an denen Zeichen gespeichert oder gestreamt werden.

Es liegt also irgendwo zwischen einem und vier Bytes, je nachdem, welches Zeichen Sie im Unicode-Bereich darstellen möchten.

Aus Wikipedia zu Unicode:

In der Informatik ist Unicode ein Industriestandard, der es Computern ermöglicht, ausgedrückte Texte konsistent darzustellen und zu bearbeiten die meisten Schriftsysteme der Welt.

Daher ist es in der Lage, die meisten (aber nicht alle) Schriftsysteme der Welt darzustellen.

Ich hoffe das hilft :)

Was ist also eine "Unicode -String" in Python?

Python „weiß“, dass Ihre Zeichenfolge Unicode ist.Wenn Sie also Regex darauf anwenden, weiß es, welches Zeichen ist und welches nicht usw., was wirklich hilfreich ist.Wenn Sie strlen durchgeführt haben, erhalten Sie auch das richtige Ergebnis.Wenn Sie beispielsweise bei Hello die Zeichenfolgen gezählt haben, erhalten Sie 5 (auch wenn es Unicode ist).Wenn Sie jedoch die Zeichenfolge eines Fremdworts gezählt haben und diese Zeichenfolge keine Unicode-Zeichenfolge war, erhalten Sie ein viel größeres Ergebnis.Pythong verwendet die Informationen aus der Unicode-Zeichendatenbank, um jedes Zeichen im Unicode-String zu identifizieren.Hoffentlich hilft das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top