【问题标题】:Sanitizing UTF-8 encoded strings清理 UTF-8 编码的字符串
【发布时间】:2012-01-27 08:52:10
【问题描述】:

我想在将 UTF-8 编码字符串用作 MySQL SELECT 语句的一部分之前对其进行清理。

例如,我有:

query = MySQLdb.escape_string(query)

但是这条线导致了一个引发的异常,读取为

'ascii' 编解码器无法对位置 0-2 中的字符进行编码:序数不在 范围(128)。

我该如何处理?

【问题讨论】:

  • 很明显,假设您的字符串是 US-ASCII 而不是 UTF-8。我会尝试使用query.encode("utf-8") 之类的方式对其进行显式编码

标签: python mysql sanitization


【解决方案1】:

看起来 MySQLdb 正在尝试将您的 unicode 查询编码为字符串。为此,它使用默认编码:ASCII。

现在,你的输入不能被编码成 ASCII,所以你只需要告诉 python 它应该使用什么编码:utf-8。

您可以使用query = query.encode('utf-8'). 实现此目的

【讨论】:

  • 正是我的问题。我必须跳进跳出 UTF-8 编码,才能让 MySQL 开心并让其他人开心。
  • 不幸的是,每当您使用 python 无法自行处理的非 ASCII unicode 字符串时,这种情况总是会发生,对于许多模块。对于您的 MySQLdb 问题,您可能需要查看 ORM 层,例如 SQLAlchemy。
【解决方案2】:

在您的示例中,query 的类型为“str”。如果你在字符串前面加上一个 'u',它就变成了 'unicode' 类型。

>>> query = "こうえん"
>>> print type(query)
<type 'str'>
>>> query = u"こうえん"
>>> print type(query)
<type 'unicode'>

这是 Python 2.x 版和 3.x 版之间的主要区别之一。从 3.0 开始,所有字符串默认都是 'unicode'。

【讨论】:

  • 注意: 我认为我没有安装该模块,但这是针对一般问题的一般解决方案。我希望它有效,但如果它不起作用,@Ada 的代码可能会(或两者的组合)。
  • 我使用的是 Python 2.6.6。我已经从问题中删除了“こうえん”,因为它没有帮助。
  • 我需要为 MySQL 设置一些全局字符集吗?
【解决方案3】:
query = "こうえん"
query = MySQLdb.escape_string(unicode(query,'utf-8'))

【讨论】:

  • 这给出了“异常值:不支持解码 Unicode”。我正在使用 Python 2.6.6。我已经从问题中删除了“こうえん”,因为它没有帮助。
  • 我需要为 MySQL 设置一些全局字符集吗?
  • 哪个函数给出了错误?尝试分离这两个函数,即query = unicode(query,'utf-8'),然后将query 传递给转义函数。错误在哪一行?
  • decoding Unicode is not supported 错误表示字符串已经是 Unicode。这意味着这不是问题!
猜你喜欢
  • 2020-01-20
  • 2014-06-09
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多