Dekodieren, wenn es nicht in unicode
Möchte ich meine Funktion zu nutzen, ein argument, das könnte ein unicode-Objekt oder ein utf-8-codierte Zeichenfolge. In meiner Funktion möchte ich konvertiert das argument in unicode. Ich habe so etwas wie dieses:
def myfunction(text):
if not isinstance(text, unicode):
text = unicode(text, 'utf-8')
...
Ist es möglich, zu vermeiden isinstance? Ich war auf der Suche nach etwas mehr duck-typing freundlich.
Während meiner Experimente mit der Dekodierung, ich habe laufen in mehrere seltsame Verhaltensweisen von Python. Zum Beispiel:
>>> u'hello'.decode('utf-8')
u'hello'
>>> u'cer\xf3n'.decode('utf-8')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in po
sition 3: ordinal not in range(128)
Oder
>>> u'hello'.decode('utf-8')
u'hello' 12:11
>>> unicode(u'hello', 'utf-8')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: decoding Unicode is not supported
Durch die Art und Weise. Ich bin mit Python 2.6
- Möchten Sie vielleicht einen Blick auf diese Frage: Python UnicodeDecodeError - Bin ich Missverständnis Unicode?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man nur versuchen Decodierung mit dem 'utf-8' codec, und wenn das nicht funktioniert, dann das Objekt zurückgeben.
Wenn Sie ein unicode-Objekt und rufen Sie seine
decode
Methode mit der'utf-8'
codec, Python versucht zuerst konvertieren Sie die unicode-Objekt in ein string-Objekt und ruft dann das string-Objekt s decode('utf-8') - Methode.Manchmal ist die Konvertierung von unicode-Objekt string-Objekt schlägt fehl, weil Python2 verwendet die ascii-codec standardmäßig.
So, im Allgemeinen, nie versuchen, decode unicode-Objekte. Oder, wenn man versuchen muss, Falle es in einen try..except-block. Gibt es vielleicht ein paar codecs für das decodieren von unicode-Objekten funktioniert in Python2 (siehe unten), aber Sie wurden entfernt in Python ist3.
Sehen diese Python-bug-ticket für eine interessante Diskussion der Frage,
und auch Guido van Rossum ' s blog:
Ich bin mir nicht bewusst, eine gute Möglichkeit zu vermeiden, die
isinstance
check-in Ihrer Funktion, aber vielleicht jemand anderes. Ich kann darauf hinweisen, dass die beiden weirdnesses, die Sie zitieren sind, weil Sie etwas tun, das keinen Sinn macht: Sie Versuchen zu entschlüsseln, in das Unicode-etwas, das bereits entschlüsselt in Unicode.Ersten sollte stattdessen wie folgt Aussehen, die dekodiert UTF-8-Codierung dieses Strings in der Unicode-version:
Und der zweite sollte so Aussehen (nicht mit einem
u''
Unicode-string-literal):unicode
mit einer Unicode-Zeichenfolge und keine Kodierung angegeben, wird immer arbeiten, während Sie einen Anruf mit einer beliebigen Codierung angegeben wird immer scheitern.