Decoding, wenn es nicht Unicode ist

8

Ich möchte, dass meine Funktion ein Argument verwendet, das ein Unicode-Objekt oder eine utf-8-codierte Zeichenfolge sein könnte. Innerhalb meiner Funktion möchte ich das Argument in Unicode konvertieren. Ich habe so etwas:

%Vor%

Ist es möglich, die Verwendung von isinstance zu vermeiden? Ich war auf der Suche nach etwas mehr Ente tippen freundlich.

Während meiner Experimente mit der Decodierung bin ich auf einige seltsame Verhaltensweisen von Python gestoßen. Zum Beispiel:

%Vor%

Oder

%Vor%

Übrigens. Ich benutze Python 2.6

    
Manuel Ceron 04.10.2010, 17:47
quelle

2 Antworten

14

Sie könnten einfach versuchen, es mit dem 'utf-8' Codec zu dekodieren, und wenn das nicht funktioniert, dann geben Sie das Objekt zurück.

%Vor%

Wenn Sie ein Unicode-Objekt nehmen und seine decode -Methode mit dem 'utf-8' -Codec aufrufen, versucht Python zuerst, das Unicode-Objekt in ein String-Objekt zu konvertieren, und dann ruft es die Decodierung des String-Objekts auf ('utf-8'). ) Methode.

Manchmal schlägt die Konvertierung von einem Unicode-Objekt in ein String-Objekt fehl, weil Python2 standardmäßig den ASCII-Codec verwendet.

Versuchen Sie also im Allgemeinen niemals, Unicode-Objekte zu dekodieren. Oder, wenn Sie es versuchen müssen, fangen Sie es in einem try..except Block ab. Es kann ein paar Codecs geben, für die die Dekodierung von Unicode-Objekten in Python2 funktioniert (siehe unten), aber sie wurden in Python3 entfernt.

Sehen Sie sich dieses Python-Fehlerticket für eine interessante Diskussion des Problems an. und auch Guido van Rossums Blog :

  

"Wir übernehmen ein etwas anderes   Ansatz zu Codecs: während in Python 2,   Codecs können entweder Unicode oder   8-Bit als Eingabe und erzeugen entweder als   Ausgabe, in Py3k, Codierung ist immer a   Übersetzung aus einem Unicode (Text)   String zu einem Array von Bytes und   Decodierung geht immer das Gegenteil   Richtung. Das bedeutet, dass wir mussten   Drop ein paar Codecs, die nicht hineinpassen   Dieses Modell, zum Beispiel rot13, base64   und bz2 (diese Conversions sind immer noch   unterstützt, nur nicht durch die   API kodieren / decodieren. "

    
unutbu 04.10.2010, 18:29
quelle
0

Ich bin mir nicht bewusst, dass es eine gute Möglichkeit gibt, die isinstance -Kontrolle in Ihrer Funktion zu vermeiden, aber vielleicht ist es jemand anderes. Ich kann darauf hinweisen, dass die beiden Seltsamkeiten, die Sie anführen, darin bestehen, dass Sie etwas tun, was keinen Sinn ergibt: Sie versuchen, Unicode zu dekodieren, das bereits in Unicode dekodiert wurde.

Der erste sollte stattdessen so aussehen, der die UTF-8-Codierung dieser Zeichenfolge in die Unicode-Version decodiert:

%Vor%

Und Ihre Sekunde sollte so aussehen (nicht mit u'' Unicode String-Literal):

%Vor%     
Will McCutchen 04.10.2010 17:53
quelle

Tags und Links