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)
Run Code Online (Sandbox Code Playgroud)
这str
是一个中国/日本人物.
为什么ascii
不起作用?
如何理解Out [2]和Out [3],即它们到底是什么?
为什么
ascii
不起作用?
str='?'
不是ASCII字符,它在ASCII范围之外,因此不能表示为ASCII字符.
编码不必处理每个可能的Unicode字符,并且大多数编码不会.例如,Python的默认编码是'ascii'编码.将Unicode字符串转换为ASCII编码的规则很简单; 对于每个代码点:
如果代码点<128,则每个字节与代码点的值相同.
如果代码点为128或更大,则无法在此编码中表示Unicode字符串.(在这种情况下,Python会引发UnicodeEncodeError异常.)
如何理解
Out[2]
和Out[3]
,即他们究竟是谁?
它们是字节字符串(不是字符串).Out[2]
是以?
UTF-8代码单位表示代码点的字节序列.符号\xe7
表示具有十六进制值e7的字节.Out[3]
是以?
UTF-16代码单位表示代码点的字节序列.
要理解字符,字节和代码单元之间的区别,请仔细和完整地阅读python的Unicode教程.对于相同材料的另一个相当好的处理,请阅读Joel Spolsky的绝对最低每个软件开发人员,绝对必须知道Unicode和字符集(没有借口!).你应该知道这一点,没有任何借口!
归档时间: |
|
查看次数: |
369 次 |
最近记录: |