Unicode gegen UTF-8 Verwirrung in Python / Django?

Ich stolperte über diese Passage im Django-Tutorium :

Django-Modelle haben eine Standard- Str () -Methode, die unicode () aufruft und das Ergebnis in ein UTF-8 durchtestringt. Dies bedeutet, dass Unicode (p) einen Unicode-String zurückgibt und str (p) einen normalen String zurückgibt, wobei Zeichen mit UTF-8 codiert sind.

  • Django: gettext und coercing zu unicode
  • Wie bekomme ich Unicode-Zeichen in django url?
  • Wie kann ich überprüfen, ob ein Python-Unicode-String nicht-westliche Buchstaben enthält?
  • Django: Nicht-ASCII-Charakter
  • Wie man Unicodes holt und sie in utf-8 Datenbanken speichert
  • Wie kann ich utf-8 Inhalte in einer urllib2-Anfrage senden?
  • Nun, ich bin verwirrt, weil afaik Unicode ist keine besondere Darstellung, also was ist ein "Unicode-String" in Python? Heißt das UCS-2? Googeln erschien dieses "Python Unicode Tutorial", das kühn sagt

    Unicode ist eine Zwei-Byte-Codierung, die alle gängigen Schriftsysteme der Welt abdeckt.

    Was ist falsch falsch, oder ist es? Ich bin schon oft von Charakter-Set und Codierung Fragen verwirrt worden, aber hier bin ich ganz sicher, dass die Dokumentation, die ich lese, verwirrt ist. Weiß jemand, was in Python los ist, wenn es mir einen "Unicode String" gibt?

  • Urllib2 urlopen arbeitet sehr zufällig
  • Sagen Sie urllib2, benutzerdefinierte DNS zu verwenden
  • Wie füge ich einen Header zu urllib2 opener hinzu?
  • Urllib2 / pycurl in Django: Fetch XML, HTTP-Status überprüfen, HTTPS-Verbindung überprüfen
  • Holen Sie zuerst n Bytes aus der URL
  • Erforderliche Header für Urllib2.Request?
  • 5 Solutions collect form web for “Unicode gegen UTF-8 Verwirrung in Python / Django?”

    Was ist ein "Unicode String" in Python? Heißt das UCS-2?

    Unicode-Strings in Python werden intern entweder als UCS-2 (feste Länge 16-Bit-Darstellung, fast die gleiche wie UTF-16) oder UCS-4 / UTF-32 (feste Länge 32-Bit-Darstellung) gespeichert. Es ist eine Kompilierzeit-Option; Unter Windows ist es immer UTF-16, während viele Linux-Distributionen UTF-32 ('wide mode') für ihre Versionen von Python setzen.

    Sie sind in der Regel nicht zu kümmern: Sie sehen Unicode-Code-Punkte als einzelne Elemente in Ihren Strings und Sie werden nicht wissen, ob sie als zwei oder vier Bytes gespeichert sind. Wenn du in einem UTF-16-Build bist und du musst Zeichen außerhalb der Basic Multilingual Plane behandeln, wirst du es falsch machen, aber das ist immer noch sehr selten, und Benutzer, die wirklich die zusätzlichen Charaktere brauchen, sollten umfangreiche Builds zusammenstellen.

    Einfach falsch, oder ist es

    Ja, es ist ganz falsch Um fair zu sein, denke ich, dass das Tutorium ziemlich alt ist. Es ist wahrscheinlich Vor-Datum breite Unicode-Strings, wenn nicht Unicode 3.1 (die Version, die Zeichen außerhalb der Basic Multilingual Plane eingeführt).

    Es gibt eine zusätzliche Verwechslungsquelle, die aus der Gewohnheit von Windows besteht, den Begriff "Unicode" zu verwenden, um die UTF-16LE-Codierung zu verstehen, die NT intern verwendet. Leute aus Microsoftland können diese etwas irreführende Gewohnheit oft kopieren.

    Mittlerweile habe ich eine verfeinerte Forschung gemacht, um zu überprüfen, was die interne Repräsentation in Python ist, und auch was ihre Grenzen sind. " Die Wahrheit über Unicode In Python " ist ein sehr guter Artikel, der direkt von den Python-Entwicklern zitiert. Anscheinend ist die interne Repräsentation entweder UCS-2 oder UCS-4 abhängig von einem Kompilierzeitschalter. Also Jon, es ist nicht UTF-16, aber deine Antwort hat mich sowieso auf den richtigen Track gebracht.

    Python speichert Unicode als UTF-16. Str () gibt die UTF-8-Darstellung des UTF-16-Strings zurück.

    Von Wikipedia auf UTF-8 :

    UTF-8 (8-Bit-UCS / Unicode-Transformationsformat) ist eine Zeichenkodierung mit variabler Länge für Unicode. Es ist in der Lage, ein beliebiges Zeichen im Unicode-Standard darzustellen , doch ist die anfängliche Codierung von Bytecodes und Zeichenzuweisungen für UTF-8 rückwärtskompatibel mit ASCII. Aus diesen Gründen wird es immer die bevorzugte Kodierung für E-Mail, Webseiten [1] und andere Orte, an denen Zeichen gespeichert oder gestreamt werden.

    Also, es ist irgendwo zwischen einem und vier Bytes je nachdem, welchen Charakter du innerhalb des Reiches von Unicode darstellen möchtest.

    Aus Wikipedia auf Unicode:

    Im Computing ist Unicode ein Industriestandard, der es Computern ermöglicht, den in den meisten Schriftsystemen der Welt ausgedrückten Text konsequent darzustellen und zu manipulieren.

    So kann man die meisten (aber nicht alle) der Schriftsysteme der Welt repräsentieren.

    Ich hoffe das hilft 🙂

    Also, was ist ein "Unicode String" in Python?

    Python 'weiß', dass dein String Unicode ist. Also, wenn Sie regex auf es, wird es wissen, was ist Charakter und was ist nicht usw., was ist wirklich hilfreich. Wenn du einen String gemacht hast, wird es auch das richtige Ergebnis geben. Als Beispiel, wenn Sie String zählen auf Hallo, erhalten Sie 5 (auch wenn es Unicode ist). Aber wenn du eine Streicherzählung eines Fremdworts gemacht hast und dieser String kein Unicode-String war, als du viel größeres Ergebnis hast. Pythong verwendet die Informationsform der Unicode-Zeichendatenbank, um jedes Zeichen in der Unicode-Zeichenfolge zu identifizieren. Ich hoffe, das hilft.

    Python ist die beste Programmiersprache der Welt.