2013-02-04 391 views
3

如何正確讀取日文和中文字符。 我正在使用python 2.5。輸出顯示爲"E:\Test\?????????"中文和日文字符支持python

path = r"E:\Test\は最高のプログラマ" 
t = path.encode() 
print t 
u = path.decode() 
print u 
t = path.encode("utf-8") 
print t 
t = path.decode("utf-8") 
print t 
+1

http://www.pgbovine.net/unicode-python.htm,它會回答你所有的問題。按照鏈接。 – Martian2049

回答

2

您應該強制字符串是一個unicode對象像字符串文字

path = ur"E:\Test\は最高のプログラマ" 

文檔相關的2.5位於here

編輯:我如果對象是2.5中的unicode,但文檔確實表示\uXXXX[XXXX]將被處理,並且stri ng將是「一個Unicode字符串」。

+0

Python 2.5支持很好,但unicode對象只是圖片的一小部分。 –

11

請仔細閱讀Python Unicode HOWTO;它解釋瞭如何處理和在您的Python代碼中包含非ASCII文本。

如果你想在你的代碼日文文本文字,你有幾種選擇:

  • 使用Unicode文本(創建unicode對象而不是字節字符串),而任何非ASCII碼點被表示爲一個unicode轉義字符。他們採取的\uabcd的形式,讓一個反斜槓,一個u和4個十六進制數字:

    ru = u'\u30EB' 
    

    將是一個字符,片假名「RU」碼點(「ル」)。

  • 使用unicode字面值,但在某種形式的編碼中包含字符。你的文本編輯器將以給定的編碼保存文件(比如UTF-16);你需要在源文件的頂部聲明編碼:其中「ル」包括不使用轉義

    # encoding: utf-16 
    
    ru = u'ル' 
    

    。 Python 2文件的默認編碼是ASCII,所以通過聲明編碼,可以直接使用日文。

  • 使用字節字符串文字,就緒編碼。通過其他方式對代碼點進行編碼,並將它們包含在字節字符串文字中。如果你打算跟他們做的是反正編碼形式使用它們,這應該是罰款:

    ru = '\xeb\x30' # ru encoded to UTF16 little-endian 
    

    我編碼「ル」爲UTF-16小端,因爲這是默認的Windows NTFS文件名的編碼。

接下來的問題將是你的終端,Windows控制檯因爲不支持許多字符集而出名。您可能想要將其配置爲處理UTF-8。見this question的一些細節,但你需要在控制檯中運行以下命令:

chcp 65001 

切換到UTF-8,您可能需要切換到一個控制檯字體,可以處理你的代碼點(龍力也許?)。

+0

['chcp 65001'沒有必要,或者通用性不夠](http://bugs.python.org/issue1602)。 – jfs

+0

@ J.F.Sebastian:是的,我在這裏和那裏看到了有關這個問題的線索,包括我所鏈接的SO問題。感謝那個錯誤鏈接,這很好。 –

3

有兩個獨立的問題:

  1. 如果使用非ASCII字符和使用數據的Unicode文本表示文本如您應該指定Python源編碼:

    # -*- coding: utf-8 -*- 
    path = ur"E:\Test\は最高のプログラマ" 
    
  2. Printing Unicode to Windows console is complicated但是如果你設置正確的字體,那麼只是:

    print path 
    

    可能會工作。

無論您的控制檯是否可以顯示路徑,它應該是罰款傳遞的Unicode路徑文件系統功能,例如: -

entries = os.listdir(path) 

不要字節串叫.encode(char_enc),稱之爲對Unicode字符串代替。
不要在Unicode字符串上調用.decode(char_enc),而是使用字符串調用它。

相關問題