CP -> Unicode-Umwandlung
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
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
On 11/23/12 3:49 PM, "Olе Streicher"
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?
decode ist nur auf *Bytestrings* sinnvoll. Du dekodierst von einem Byte-string der in einem spezifischen encoding ist zu unicode, und encodierst von unicode mit einem encoding zu byte-strings. Das hier klappt:
s = '\xc2\xce\xd2 \xd2\xc2\xce\xc9 \xc1\xc8\xcb\xc5\xd2' print s.decode("cp1251").encode("utf-8") ВОТ ТВОЙ БИЛЕТ
Ob das *Sinn* macht kann ich mangels kyrillisch-Kenntnsissen nicht beurteilen. Diez
Am 23.11.2012 15:49 schrieb Olе Streicher:
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?
Daß es schon unicode ist, der sich auf den Bereich 0..255 beschränkt. D.h. du mußt erst nach latin1 kodieren: sl = s.encode('latin1') und hast dann den ursprünglichen Bytestring: sl == '\xc2\xce\xd2 \xd2\xc2\xce\xc9 \xc1\xc8\xcb\xc5\xd2' Das kannst Du nun so dekodieren, wie Du es für richtig hältst, z. B. print sl.decode('cp1251', 'ignore') Das ergibt ВОТ ТВОЙ БИЛЕТ. Google findet da jedenfalls mal was zu (sogar mit Musikbezug), im Gegensatz zu ТЮв вТЮЩ СШЫХв, was bei print sl.decode('iso-8859-5') herauskäme... Thomas
Thomas Rachel
sl == '\xc2\xce\xd2 \xd2\xc2\xce\xc9 \xc1\xc8\xcb\xc5\xd2' Das kannst Du nun so dekodieren, wie Du es für richtig hältst, z. B.
print sl.decode('cp1251', 'ignore')
Das ergibt ВОТ ТВОЙ БИЛЕТ. Google findet da jedenfalls mal was zu (sogar mit Musikbezug), im Gegensatz zu ТЮв вТЮЩ СШЫХв, was bei print sl.decode('iso-8859-5') herauskäme...
u'Большое спасибо!' :-) Cheers Ole
participants (4)
-
Diez Roggisch
-
ole-usenet-spam@gmx.net
-
Thomas Rachel
-
Walter Dörwald