2013-08-04 428 views
1

我已經在windows7中通過崇高文本寫了一個python文件,這個文件中有一些中文字符,所以當我運行它時,這些字符變得無法識別(同樣發生在cmd和git bash中):關於python unicode的混淆

# -*- coding: utf-8 -*- 
str = "測試" 

print str 

arr = [] 
arr.append(str) 

print arr 

結果是:

嫺嬭瘯 
['\xe6\xb5\x8b\xe8\xaf\x95'] 

我怎樣才能解決這個問題?這個問題的原因是什麼?並且arr打印結果不應該像\uXXX那樣是unicode?

順便說一句,沒有# -*- coding: utf-8 -*-我甚至無法運行:

$ python test.py 
    File "test.py", line 2 
SyntaxError: Non-ASCII character '\xe6' in file test.py on line 2, but no encodi 
ng declared; see http://www.python.org/peps/pep-0263.html for details 

我只是一派的說法,爲什麼就不能沒有它運行的代碼?

+0

你運行這個Python版本嗎? –

+0

@CodieCodeMonkey:2.7.5 – hh54188

+0

由於unicode處理在3中有所不同,我將添加Python 2.7作爲標記。 –

回答

3

你看到你的字符串的UTF-8編碼的版本(你不應該命名str,順便說一句)。通過在腳本開始處添加# -*- coding: utf-8 -*-行,您告訴Python,這是腳本正在使用的編碼。你確實確實它實際上是使用該編碼?

如果不是這種情況(請檢查您的編輯器!),或者如果您的終端窗口(您正在使用的字符串)恰好使用了不同的編碼,則會出現亂碼(或錯誤(如果編碼的字符串不能用該編碼解釋)。

只有你解碼你的(字節)字符串,你會得到一個Unicode對象。

所以首先你需要知道你的終端的字符編碼。然後,您應該儘快將所有字符串轉換爲Unicode,並只處理程序中的Unicode對象,直到需要輸出它們 - 此時您需要將它們編碼爲正確的編碼。

例如

# -*- coding: utf-8 -*- 
s = u"測試" 
s = s + u"嫺嬭瘯" 
print s.encode("somecodepage") 
4

# -*- coding: utf-8 -*-需要specify the encoding用於文件。

你得到['\xe6\xb5\x8b\xe8\xaf\x95']作爲輸出,因爲你的字符串是一個字節字符串而不是一個unicode字符串,爲字符串添加一個u前綴將它轉換爲一個unicode字符串。

>>> strs = u"測試" 
>>> lis = [strs] 
>>> print lis 
[u'\u6d4b\u8bd5'] 
>>> print lis[0] 
測試