解码Unicode字符串; 这意味着什么,我该如何避免呢?

Fre*_*Foo 1 python unicode character-encoding python-2.x python-3.x

我正在寻找一种将用户提供的字符串转换为UTF-8的简单方法.它不一定非常聪明; 它应该处理所有ASCII字节字符串和所有Unicode字符串(2.x unicode,3.x str).

由于unicode在3.x中已经消失并str改变了含义,我认为检查decode方法的存在并调用不带参数的Python 可能是一个好主意,让Python根据语言环境找出要做的事情,而不是做isinstance检查.事实证明,这根本不是一个好主意:

>>> u"één"
u'\xe9\xe9n'
>>> u"één".decode()
Traceback (most recent call last):
  File "<ipython-input-36-85c1b388bd1b>", line 1, in <module>
    u"één".decode()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的:

  1. 为什么有unicode.decode方法呢?我认为Unicode字符串被认为是"未编码".这看起来是获得双重编码字符串的可靠方法.
  2. 如何以与Python 3向前兼容的方式解决此问题?

phi*_*hag 5

谈到"解码"unicode字符串是没有用的.你想连接的代码它字节.unicode.decode仅出于历史原因; 它的语义毫无意义.因此,它已在Python 3中删除.

但是,encode/ decode语义在历史上已经扩展到包括(字符)字符串到字符串或字节到字节的编码,例如rot13或bzip2.在Python 3.1中,这些伪编码被删除,并在Python 3.2中重新引入.

通常,您应该设计接口,以便它们接受字符或字节字符串.接受这两者的接口(出于向后兼容性以外的原因)是代码味道,难以测试,容易出现错误(如果有人传递UTF-16字节会怎么样?)并且首先具有可疑的语义.

如果你必须有一个接受字符和字节字符串的接口,你可以检查decodePython 3中是否存在该方法.如果你希望你的代码在2.x中工作,你将不得不使用isinstance.