字符串在Python与我的Unicode?
问题描述:
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?
答
你的字符串没有错!你只是混淆了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')
'នយោបាយ'
答
您正在阅读2.x文档。 str.decode()
(和bytes.encode()
)在3.x中被删除。而str
已经是一个Unicode字符串;没有必要解码它。
答
你已经有了一个unicode字符串。在Python 3中,str
是unicode字符串(Python 2.x中的unicode
),而单字节字符串(Python 2.x str
)不再被当作文本处理,它们现在称为bytes
。后者可以通过decode
方法转换为str
,但前者已经解码 - 只能将编码为回到bytes
。
还不干净。你能更清楚地解释一下吗?感谢布兰登克雷格罗德斯 – kn3l 2011-03-26 21:05:23
我已经添加了另一段和一些代码示例 - 这些使它更清晰吗? – 2011-03-26 21:09:17
现在很明显,我现在明白你的例子,非常感谢你@Brandon Craig Rhodes – kn3l 2011-03-26 21:12:13