2009-06-15 6 views
2

Das Python-Skript für russische Buchstaben Translit wird:KOI8-R: Haben Sie Probleme beim Übersetzen einer Zeichenfolge

s = u'Код Обмена Информацией, 8 бит'.encode('koi8-r') 
print ''.join([chr(ord(c) & 0x7F) for c in s]) # kOD oBMENA iNFORMACIEJ, 8 BIT 

, das funktioniert. Aber ich möchte es ändern, um Benutzereingaben zu erhalten. Nun an diesem Ich bin fest:

s = raw_input("Enter a string you want to translit: ") 

s = unicode(s) 
s = s.encode('koi8-r') 

print ''.join([chr(ord(c) & 0x7F) for c in s]) 

mit diesem enden:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128) 

Was ist los?

+1

Was ist die Zeile dieses Fehlers? – alamar

Antwort

2

s = unicode(s) erwartet ASCII-Codierung durch Rückstellung. Sie müssen eine Codierung bereitstellen, in der sich Ihre Eingabe befindet, z. s = unicode(s, 'utf-8').

+0

Das ist sehr traurig, übrigens. Sie sollten Locale-Standard verwendet haben. – alamar

+0

Oh, ich weiß nicht, @alamar - Ich finde, ich benutze oder mit jemandem über Zeichenkodierungen zu sprechen, Fehler an beiden Enden explizit verursacht Probleme, und schließlich gibt es einen Randfall, wo Sie die Informationen liefern müssen wie auch immer - besser Leute zu trainieren, um es die ganze Zeit zu tun! :-) –

+0

Nun, Docs legt auch nicht fest, was Standard ist - noch schlimmer. – alamar

1

versuchen unicode(s, encoding) wo Codierung, was auch immer Ihr Terminal ist in ist.

+0

Nun, habe ich versucht, dieses: s = raw_input (">>>") s = Unicode (s, 'utf-8') s = s.encode ('koi8-r') print '' .join ([chr (ord (c) & 0x7F) für c in s]) Hmmm, das funktioniert nicht: UnicodeDecodeError: 'utf8' Codec kann Bytes in Position 0-2 nicht decodieren: ungültige Daten – user122922

+0

Was ist Ihre Terminalcodierung? – alamar

0

bei den Fehlermeldungen suchen, das Sie sehen werden, scheint es mir, dass Ihr Terminal Codierung wahrscheinlich KOI8-R festgelegt ist, in dem Fall, dass Sie don Sie müssen keine Dekodierung der Eingabedaten durchführen. Wenn dies der Fall ist, dann alles, was Sie brauchen, ist:

>>> s = raw_input("Enter a string you want to translit: ") 
>>> print ''.join([chr(ord(c) & 0x7F) for c in s]) 
kOD oBMENA iNFORMACIEJ, 8 BIT 

Sie können dies durch s.decode('koi8-r') verdoppeln überprüfen, den Erfolg haben sollte und gibt den äquivalenten Unicode-String.

Verwandte Themen