2011-03-26 61 views
8
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> str_version = 'នយោបាយ' 
>>> type(str_version) 
<class 'str'> 
>>> print (str_version) 
នយោបាយ 
>>> unicode_version = 'នយោបាយ'.decode('utf-8') 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    unicode_version = 'នយោបាយ'.decode('utf-8') 
AttributeError: 'str' object has no attribute 'decode' 
>>> 

我的unicode字符串有什麼問題?字符串在Python與我的Unicode?

回答

10

你的字符串沒有錯!你只是混淆了encode()decode()。該字符串是有意義的符號。要將其轉換爲可存儲在文件中或通過Internet傳輸的字節,請使用encode(),其編碼爲,編碼爲,如UTF-8。每種編碼都是將有意義的符號轉換爲平面輸出字節的方案。

到時候做相反的 - 採取從一個文件或者套接字一些原始字節,並把它們變成像字母和數字符號 - 你會解碼使用字節串的decode()方法在Python 3字節

>>> str_version = 'នយោបាយ' 
>>> str_version.encode('utf-8') 
b'\xe1\x9e\x93\xe1\x9e\x99\xe1\x9f\x84\xe1\x9e\x94\xe1\x9e\xb6\xe1\x9e\x99' 

看到那麼長的一行字節?這些是UTF-8用來表示字符串的字節數,如果需要通過網絡傳輸字符串或將它們存儲在文檔中。還有許多其他編碼正在使用,但它似乎是最受歡迎的。每種編碼都可以將有意義的符號(如ន和យោ)轉換爲字節 - 計算機與之通信的小8位數字。

>>> rawbytes = str_version.encode('utf-8') 
>>> rawbytes 
b'\xe1\x9e\x93\xe1\x9e\x99\xe1\x9f\x84\xe1\x9e\x94\xe1\x9e\xb6\xe1\x9e\x99' 
>>> rawbytes.decode('utf-8') 
'នយោបាយ' 
+0

還不乾淨。你能更清楚地解釋一下嗎?感謝布蘭登克雷格羅德斯 – kn3l 2011-03-26 21:05:23

+0

我已經添加了另一段和一些代碼示例 - 這些使它更清晰嗎? – 2011-03-26 21:09:17

+0

現在很明顯,我現在明白你的例子,非常感謝你@Brandon Craig Rhodes – kn3l 2011-03-26 21:12:13

7

您正在閱讀2.x文檔。 str.decode()(和bytes.encode())在3.x中被刪除。而str已經是一個Unicode字符串;沒有必要解碼它。

3

你已經有了一個unicode字符串。在Python 3中,str是unicode字符串(Python 2.x中的unicode),而單字節字符串(Python 2.x str)不再被當作文本處理,它們現在稱爲bytes。後者可以通過decode方法轉換爲str,但前者已經解碼 - 只能將編碼爲回到bytes