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.

  • Encoding gibt "'ascii' Codec kann nicht codieren Zeichen ... ordinal nicht in Reichweite (128)"
  • Wie kann ich utf-8 Inhalte in einer urllib2-Anfrage senden?
  • Die Druckausgabe kann nicht codiert / decodiert werden
  • Django: Nicht-ASCII-Charakter
  • Python UTF8 String Verwirrung
  • Unterstützen Sie UnicodeEncodeError Ausnahmen, wenn Sie von Aptana Studio PyDev ausgeführt werden
  • 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?

  • Timeout eine Datei Download mit Python urllib?
  • Multi-Gewinde-Web-Scraper mit urlretrieve auf einem Cookie-fähigen Website
  • Wie sende ich einen benutzerdefinierten Header mit urllib2 in einer HTTP-Anfrage?
  • Verwenden von gepaarten Zertifikaten mit urllib2
  • Wie ruf ich die Methode urllib2 get_header an?
  • So speichern Sie "komplette Webseite" nicht nur grundlegende HTML mit Python
  • 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.