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

时间:2012-01-17 04:17:48

标签: 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)

str是中国/日本人物。

  • 为什么ascii不起作用?

  • 如何理解Out [2]和Out [3],即它们到底是什么?

4 个答案:

答案 0 :(得分:5)

  

为什么ascii不起作用?

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

来自Unicode tutorial for python

  

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

     
      
  1. 如果代码点是&lt; 128,每个字节与代码点的值相同。

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

  4.   

  

如何理解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字符,你可以在这里看看。

http://www.asciitable.com/

基本上只有ascii中的基本字符是英文字母和一些标点/特殊字符。

答案 3 :(得分:2)

您无法将该字符编码为ascii,因为它不是可以使用ascii表示的字符的一部分。

Out[2]Out[3]是你的角色在utf-8和utf-16中的二进制表示。