python - 解码 Unicode 字符串;这是什么意思,我该如何避免呢?

标签 python unicode character-encoding python-3.x python-2.x

我正在寻找一种将用户提供的字符串转换为 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)

我的问题有两个方面:

  1. 为什么会有 unicode.decode 方法?我认为 Unicode 字符串被认为是“未编码”的。这看起来像是获得双重编码字符串的可靠方法。
  2. 如何以与 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/

相关文章:

java - 在 Java 中初始化不稳定的字符

php - 我有一个 UTF-8 mysql 数据库中的 latin1 编码数据,我该如何解决这个问题?

python - 日志文件到 Pandas Dataframe

python - 有没有办法在 python 中读回随机种子?

MYSQL - 在 TEXT 列中存储 unicode 字符(表情符号)

python - 奇怪的 `UnicodeEncodeError` 使用 `os.path.exists`

C/C++ 如何读取 UNICODE 的 const char?

python - 如何将嵌套 JSON 转换为 CSV

python - python->scheme转换的问题

ruby - 如何在 Ruby 中将...(省略号)更改为...(三个句号)?