为什么str.encode('ascii')不能用于这种情况?

qaz*_*wsx 1 python unicode

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],即它们到底是什么?

wkl*_*wkl 5

为什么ascii不起作用?

str='?' 不是ASCII字符,它在ASCII范围之外,因此不能表示为ASCII字符.

pythonUnicode教程:

编码不必处理每个可能的Unicode字符,并且大多数编码不会.例如,Python的默认编码是'ascii'编码.将Unicode字符串转换为ASCII编码的规则很简单; 对于每个代码点:

  1. 如果代码点<128,则每个字节与代码点的值相同.

  2. 如果代码点为128或更大,则无法在此编码中表示Unicode字符串.(在这种情况下,Python会引发UnicodeEncodeError异常.)


如何理解Out[2]Out[3],即他们究竟是谁?

它们是字节字符串(不是字符串).Out[2]是以?UTF-8代码单位表示代码点的字节序列.符号\xe7表示具有十六进制值e7的字节.Out[3]是以?UTF-16代码单位表示代码点的字节序列.

要理解字符,字节和代码单元之间的区别,请仔细和完整地阅读pythonUnicode教程.对于相同材料的另一个相当好的处理,请阅读Joel Spolsky的绝对最低每个软件开发人员,绝对必须知道Unicode和字符集(没有借口!).你应该知道这一点,没有任何借口!