的問題是,你的終端窗口(我假設cmd.exe
,因爲這聽起來像Windows),是不是UTF-8,但一些拉丁-1樣的字符集,如Windows 1252。
因此,您將這些Unicode字符串編碼爲UTF-8字節序列,然後將它們發送給終端,終端將這些UTF-8字節序列解釋爲如同Windows-1252字節序列,並將它們顯示爲垃圾。
例如,u"Graziano Pellè"
,當編碼爲UTF-8,是:
'Graziano Pell\xc3\xa8'
爲什麼呢?那麼,在UTF-8中,ASCII字符編碼爲一個字節,所以G
,又名U + 0047,成爲單字節0x47
,幾乎在任何字符集中看起來都是G
,但非ASCII字符編碼爲兩個或多個字節,所以è
,又名U + 00E8,變成0xc3
和0xa8
。在Windows-1252中,0xc3
是字符Ã
,並且0xa8
是字符¨
。
最簡單的辦法在這裏,如果你的Python正確檢測終端的字符集,是隻直接打印Unicode字符串。
如果不是,您必須以某種方式查找字符集(或者只是對其進行硬編碼,如果僅用於本地使用;可能是cp1252
,但您可以在系統偏好設置中找到它作爲「OEM代碼頁「)並對其進行編碼,而不是編碼爲UTF-8。
最後一兩件事:
我是通用字符集支持大多數主要語言字母的印象。
它確實。*但問題是,你不能只編寫Unicode到控制檯;你必須寫字節。**問題變成,哪些字節?如果您編寫UTF-8字節,並且終端預期爲cp1252字節,則會得到mojibake。
*其實,「通用字符集」通常是指ISO-60464或UCS 2,沒有現代的Unicode ......但他們是第一個61K字左右是相同的,所以讓我們假裝是足夠接近...
**這在Windows上並不實際;您可以改爲編寫16位單詞,並保證將其解釋爲UTF-16。但是Python 2.x不知道如何以這種方式使用Windows控制檯,因此,除非您想直接開始製作Win32 API調用,而不是使用諸如print
之類的友好事物,否則不會對您有所幫助。
請指定是否使用Python 2或Python 3 – 2014-09-24 22:12:46
@MattiVirkkunen嗨,感謝您的回覆。我使用python 2.7。 – gdogg371 2014-09-24 22:13:18
如果你沒有專門編碼你的字符串會發生什麼?聽起來就像你對你的字符串進行雙重編碼。 (... Python 3更好,因爲默認情況下,它具有真正的Unicode字符串。) – 2014-09-24 22:14:11