2017-09-06 3 views
1

Okay. Also ich habe eine Bibliothek, die mir einen Wert wie das ist zu geben:Welche Kodierung erwartet das Unicode-Literal von Python 2.7?

>>> x 
'ADC (10^-6 mm\xb2/s):Sep 05 2017 11-58-19 CDT' 
>>> type(x) 
str 
>>> print(x) 
ADC (10^-6 mm?/s):Sep 05 2017 11-58-19 CDT 

Es ist nicht ascii, und es scheint nicht UTF-8 zu sein entweder:

>>> x.decode('utf-8') 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 13: invalid start byte 

und ich kann nicht einfach wandeln es:

>>> y = unicode(x) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb2 in position 13: ordinal not in range(128) 

Aber ich kann dies tun, mit straight-up kopieren und Einfügen:

>>> y = u'ADC (10^-6 mm\xb2/s):Sep 05 2017 11-58-19 CDT' 
>>> type(y) 
unicode 
>>> y.encode('utf-8') 
'ADC (10^-6 mm\xc2\xb2/s):Sep 05 2017 11-58-19 CDT' 
>>> print(y) 
ADC (10^-6 mm²/s):Sep 05 2017 11-58-19 CDT 

Ich möchte x in Typ unicode drehen. Das Zuweisen des Werts als ein Literal funktioniert aus irgendeinem Grund. Gibt es eine Möglichkeit, die gleichen Regeln für die literale Zuweisung zu verwenden, um meine x zu dekodieren?

Entschuldigung. Ich weiß, dass ich hier etwas sehr Einfaches vermisse.

+0

'x.decode ('latin1')'. (Siehe [PEP-263] (https://www.python.org/dev/peps/pep-0263/)). – ekhumoro

Antwort

1

Es sieht so aus, als ob die Bibliothek Ihnen Strings in der Latin-1-Codierung (oder möglicherweise Codepage 1252) gibt. Das nervt, oder? Sie müssen raten, was die richtige Kodierung ist! (Dies ist einer der Motivationsfaktoren für Python 3.)

y = x.decode('latin-1') 

anzumerken, dass in Latin-1, '\xb2'u'\xb2' wird, wenn decodiert. Dies gilt für alle Latin-1-Zeichen, da die unteren 256 Codepunkte für Unicode mit denen von Latin-1 identisch sind.

+0

Danke! Aus irgendeinem Grund dachte ich, dass Latin-1 und Ascii identische Kodierungen sind. – Nate

+0

Darüber nachdenken: Warum funktioniert 'x = u '\ xb2''? sys.getdefaultencoding() ist ascii, sys.stdin.encoding ist utf-8. Nicht ein Latin-1 oder 8859 drin, also warum versucht es diese Codierung? – Nate

+0

@Nate: Codierung spielt hier keine Rolle. 'u '\ xb2'' ist eine Unicode-Zeichenkette, sie ist * nicht * codiert (naja, technisch ist es das, aber die Kodierung ist ein technisches Detail, das in der Implementierung der' Unicode'-Klasse versteckt ist). Es ist das gleiche wie 'u' \ u00b2'' oder 'unichr (0xb2) ', oder wie auch immer Sie" eine Unicode-Zeichenkette mit dem Zeichen U + 00B2 "angeben möchten. –