In [1]: str='美'
In [2]: str.encode('utf-8')
Out[2]: b'\xe7\xbe\x8e'
In [3]: str.encode('utf-16')
Out[3]: b'\xff\xfe\x8e\x7f'
In [4]: str.encode('ascii')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/Users/XXXuserXXXTemp/<ipython-input-4-c7b96e3e54a7> in <module>()
----> 1 str.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\u7f8e' in position 0: ordinal not in range(128)
str
是中国/日本人物。
为什么ascii
不起作用?
如何理解Out [2]和Out [3],即它们到底是什么?
答案 0 :(得分:5)
为什么
ascii
不起作用?
str='美'
不是ASCII字符,它在ASCII范围之外,因此不能表示为ASCII字符。
来自Unicode tutorial for python:
编码不必处理每个可能的Unicode字符,大多数编码都不会。例如,Python的默认编码是'ascii'编码。将Unicode字符串转换为ASCII编码的规则很简单;对于每个代码点:
如果代码点是&lt; 128,每个字节与代码点的值相同。
- 醇>
如果代码点为128或更高,则无法在此编码中表示Unicode字符串。 (在这种情况下,Python会引发UnicodeEncodeError异常。)
如何理解
Out[2]
和Out[3]
,即它们到底是什么?
它们是字节字符串(不是字符串)。 Out[2]
是字节序列,表示UTF-8代码单元中的美
代码点。符号\xe7
表示具有十六进制值e7的字节。 Out[3]
是以UTF-16代码单位表示美
代码点的字节序列。
要理解字符,字节和代码单元之间的区别,请仔细阅读Unicode tutorial for python。对于另一种相当不错的相同材料的处理,请阅读Joel Spolsky的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。你应该知道这一点,没有任何借口!
答案 1 :(得分:4)
ASCII不包含hanzi / kanji,因此没有有效的方法对其进行编码。
他们是encoded text。
答案 2 :(得分:2)
由于错误声明您提供了非ascii字符并尝试将其编码为ascii。无法工作,它必须是ascii字符才能将其编码为ascii。如果你想找到ascii字符,你可以在这里看看。
基本上只有ascii中的基本字符是英文字母和一些标点/特殊字符。
答案 3 :(得分:2)
您无法将该字符编码为ascii
,因为它不是可以使用ascii
表示的字符的一部分。
Out[2]
和Out[3]
是你的角色在utf-8和utf-16中的二进制表示。