【问题标题】:Python - tuple of unicode strings, encode errorPython - unicode 字符串元组,编码错误
【发布时间】:2013-10-29 18:08:14
【问题描述】:

我正在使用存储过程从 mysql 数据库中获取一些行。

我使用非常基本的语法:

retarr = []
cursor.callproc("employee_get", (-1, -1, -1))
for res in cursor.stored_results():
    retarr.append(res.fetchall())
cursor.close()
...

现在。一些数据结果是 unicode 字符串。我在我的数据库中使用 UTF-8 编码字符串。 我在连接中使用 charset="utf8" 和 use_unicode=True。

当我尝试打印任何包含 unicode 字符的捕获数据(整个数据元组)时,就会出现问题。 喜欢:

for row in retarr[0]:
    print(row)

它会正确打印我捕获的第一行。但第一个没有 unicode 字符。然后是第二个,我得到的只是一个著名的错误: UnicodeEncodeError:“ascii”编解码器无法在位置 19 编码字符“\u0119”:序数不在范围内 (128)。 有什么问题?我相信我遗漏了一些非常基本的东西。

我使用 Python 3.3.2,标准 mysql 连接器。操作系统。

【问题讨论】:

  • 可能是你的终端系统。例如,您可以在 cmd.exe 上获取 UnicodeEncodeError,它在 IDLE 中可以正常工作。
  • 奇怪,我用的可能是 Komodo 的问题。如果我尝试从终端(python3)简单地打印 '\u0119' 那么它可以工作,但是从 Komodo 运行它会抛出这个异常。我在首选项中将默认编码更改为 UTF-8,但它仍然不起作用。

标签: python mysql macos utf-8


【解决方案1】:

要打印 unicode 对象,需要以某种方式对其进行编码。如果您的默认编码是 ASCII,那么对于 128 个 ASCII 字符之外的任何内容都将失败。您可能需要指定编码:

print(row.encode('utf-8'))

【讨论】:

  • 好吧,我想,utf-8 是 python 3 中的标准编码,除非有人自定义它?
  • 另外,row 是一个元组。它没有编码方法。我需要弄清楚如何在 Komodo 中使用 utf-8 作为默认编码,因为似乎有问题。
  • 啊,你应该指定那行是一个元组。特别是,这意味着当您将对象作为一个整体打印时,它会在其每个成员上调用repr,这肯定不会正确编码。试试print(','.join(i.encode('utf-8') for i in row))
  • 谢谢,但是我已经提到了(整个数据元组)。无论如何,问题出在我的环境中 - 至少在全球范围内纠正这个问题。
【解决方案2】:

问题出在 PYTHONIOENCODING 环境变量中。 当我在 /etc/launchd.conf 中设置它(我的文件系统上没有文件)并重新启动我的系统时,所有问题都消失了。

【讨论】:

  • 当然,我将它设置为“utf-8”。所以它的“setenv PYTHONIOENCODING utf-8”“utf_8”是不正确的。至少在我的 OSX (10.8.4) 上
猜你喜欢
  • 2014-10-18
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2014-12-05
  • 2020-08-28
  • 2011-03-14
相关资源
最近更新 更多