CP -> Unicode-Umwandlung

23/11/2012 - 15:49 von ole-usenet-spam | Report spam
Hallo,

ich stehe gerade auf dem Schlauch. Ich habe einen Unicode-String mit
einer falschen Kodierung (vermutlich cp1251; kyrillisch):

s = u'\xc2\xce\xd2 \xd2\xc2\xce\xc9 \xc1\xc8\xcb\xc5\xd2'

Wie bekomme ich die korrigiert?

Ich dachte eigentlich an

s.decode('cp1251', 'ignore')

aber das bringt ein

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

Wo ist da mein Denkfehler?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Walter Dörwald
23/11/2012 - 16:17 | Warnen spam
On 23.11.12 15:49, Olе Streicher wrote:

Hallo,

ich stehe gerade auf dem Schlauch. Ich habe einen Unicode-String mit
einer falschen Kodierung (vermutlich cp1251; kyrillisch):

s = u'\xc2\xce\xd2 \xd2\xc2\xce\xc9 \xc1\xc8\xcb\xc5\xd2'

Wie bekomme ich die korrigiert?

Ich dachte eigentlich an

s.decode('cp1251', 'ignore')

aber das bringt ein

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

u'\xc2\xce\xd2 \xd2\xc2\xce\xc9






\xc1\xc8\xcb\xc5\xd2'.encode('latin-1').decode('cp1251')
'ВОТ ТВОЙ БИЛЕТ'

Wo ist da mein Denkfehler?



Du hast einen Unicode-String vor Dir, den kannst Du nur encoden, nicht
decoden (daß Du es trotzdem kannst liegt daran, daß Python 2 versucht
str- und unicode-Objekten dieselbe API zu geben).

Was Du machen willst ist, aus dem Zeichen U+00C2 wieder das Byte 0xc2 zu
machen, das erreichst Du dadurch, daß Du den String mit ISO-8859-1
encodest. Dann hast Du das was Du vermutlich ursprünglich als Byte-Daten
gekriegt hast. Die kannst Du dann ganz normal via cp1251 decoden.

Was statt dessen bei Deiner Variante passiert, ist folgendes: Du rufst
ein decode() für einen Unicode-String auf. decode() braucht aber einen
Byte-String. Daher encodet Python Deinen Unicode-String *vorher* mit dem
Defaultencoding (ASCII) in einen Byte-String, bevor dieser dann mit
cp1251 decoded wird. Nur leider schlàgt das Encoden fehl.

Servus,
Walter

Ähnliche fragen