我正在寻找一种将用户提供的字符串转换为 UTF-8 的简单方法。它不必非常聪明;它应该处理所有 ASCII 字节字符串和所有 Unicode 字符串(2.x unicode
,3.x str
)。
由于 unicode
在 3.x 中消失了并且 str
改变了含义,我认为检查 decode< 的存在可能是个好主意
方法并在没有参数的情况下调用它,让 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)
我的问题有两个方面:
- 为什么会有
unicode.decode
方法?我认为 Unicode 字符串被认为是“未编码”的。这看起来像是获得双重编码字符串的可靠方法。 - 如何以与 Python 3 向前兼容的方式解决这个问题?
最佳答案
谈论“解码”一个 unicode 字符串是没有用的。您想要将其en编码为字节。 unicode.decode
仅出于历史原因而存在;它的语义是没有意义的。因此,它已在 Python 3 中被删除。
但是,encode
/decode
语义在历史上已经扩展到包括(字符)字符串到字符串或字节到-字节编码,例如 rot13 或 bzip2。在 Python 3.1 中,这些伪编码被移除,并且 reintroduced in Python 3.2 .
一般来说,您应该设计您的接口(interface),以便它们接受字符或字节字符串。接受两者(出于向后兼容性以外的原因)的接口(interface)是一种代码味道,难以测试,容易出现错误(如果有人传递 UTF-16 字节怎么办?)并且首先具有可疑的语义。
如果你必须有一个接受字符串和字节字符串的接口(interface),你可以检查 Python 3 中是否存在 decode
方法。如果你希望你的代码在 2.x 中工作嗯,you'll have to use isinstance
.
关于python - 解码 Unicode 字符串;这是什么意思,我该如何避免呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592476/