2014-09-24 59 views
1

我有一個Python字符串的形式,一些文字代表外國名字:.encode(「UTF-8」)打印奇怪的字符

Graziano Pellè 
Sergio Agüero 
Cesc Fàbregas 

我編碼與語法的字符串:

(string).encode('utf-8') 

然而此打印:

Graziano Pellè 
Sergio Agüero 
Cesc Fàbregas 

這發生在串被打印到兩個命令外殼和Python殼牌,但I D不明白爲什麼。我的印象是通用字符集支持大多數主要語言的字母。如果這不是正確的編碼,我應該用什麼來代替?

感謝

+0

請指定是否使用Python 2或Python 3 – 2014-09-24 22:12:46

+0

@MattiVirkkunen嗨,感謝您的回覆。我使用python 2.7。 – gdogg371 2014-09-24 22:13:18

+0

如果你沒有專門編碼你的字符串會發生什麼?聽起來就像你對你的字符串進行雙重編碼。 (... Python 3更好,因爲默認情況下,它具有真正的Unicode字符串。) – 2014-09-24 22:14:11

回答

6

的問題是,你的終端窗口(我假設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,變成0xc30xa8。在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之類的友好事物,否則不會對您有所幫助。

+0

工作很好,謝謝。 – gdogg371 2014-09-24 22:17:20