2011-03-26 43 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