2009-06-15 69 views
2

這Python腳本被TRANSLIT爲俄文字母:KOI8-R:遇到問題轉換爲字符串

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

工程。但我想修改它以獲得用戶輸入。現在,我被困在此:

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]) 

結束了這一點:

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

有什麼不對?

+1

這個錯誤的線是什麼? – alamar 2009-06-15 11:10:07

回答

2

s = unicode(s)默認情況下需要ascii編碼。您需要爲其提供您輸入的編碼,例如s = unicode(s, 'utf-8')

+0

這很令人傷心,順便說一句。他們應該使用locale默認的。 – alamar 2009-06-15 11:15:56

+0

哦,我不知道@alamar - 我發現任何時候我正在使用或與任何人談論字符編碼,在兩端都不明確會導致問題,並且最終會出現一個必須提供信息的邊緣情況無論如何 - 更好地培訓人們一直這樣做! :-) – 2009-06-15 11:17:48

1

嘗試unicode(s, encoding)其中編碼是不管你的終端在不在。

0

望着那您看到的錯誤信息,在我看來,你的終端編碼可能是設置到KOI8-R,在這種情況下,你不不需要對輸入數據執行任何解碼。如果是這樣的話,那麼所有你需要的是:

>>> 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 

可以增加一倍s.decode('koi8-r')它應該會成功,並返回相當於unicode字符串檢查。