【问题标题】:PyMySQL UnicodeEncodeError; python shell successes but cmd failsPyMySQL UnicodeEncodeError; python shell成功但cmd失败
【发布时间】:2012-10-10 08:21:30
【问题描述】:

我是 pymysql 模块的新手并试图发现它,我有一个简单的代码:

import pymysql

conn=pymysql.connect(host="127.0.0.1",
                         port=8080,user="root",
                         passwd="mysql",
                         db="world",
                         charset="utf8",
                         use_unicode=True)
cur=conn.cursor()
cur.execute("SELECT * FROM world.city")

for line in cur:
    print(line)

cur.close()
conn.close()

我正在使用适用于 Visual Studio 的 Python 工具。当我执行代码时,它失败并出现以下错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\1.5\visualstudio_py_debugger.py", li
ne 1788, in write
    self.old_out.write(value)
  File "C:\Python32\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 6-7: cha
racter maps to <undefined>

失败的行包含城市名称:´s-Hertogenbosch

我认为这可能是 cmd 输出的相关问题,所以我切换到 python shell,我的脚本运行没有任何错误。

那么我面临的问题是什么? 我该如何解决?

我真的很想使用 Visual Studio 的 Python 工具,所以我非常欢迎能够使用 PTVS 的答案。

【问题讨论】:

    标签: python-3.x cmd python ptvs


    【解决方案1】:

    我的猜测是您收到的数据不是 unicode,尽管您的 python 脚本正在尝试将其编码为 Unicode。

    我会检查数据库和表的特定字符集和排序规则设置。 utf8 和 utf8_general_ci 是你的朋友。

    【讨论】:

    • 应用encode 意味着有一个Unicode字符串应该以某种编码方式编码到字节流中——这里是cp437。当 Unicode 字符的转换无法在目标编码中生成对应的字节时,编码失败。这样一来,我认为这不是正确的答案。
    • 再次阅读问题后,我猜 pepr 是对的,它可能与输出编码更相关。
    【解决方案2】:

    问题可能是环境的输出编码设置为 cp437 并且在执行 print(line) 可能转换为 self.old_out.write(value) 时无法将 unicode 字符转换为该编码。

    尝试通过写入文件来替换循环内的print(),例如:

    with open('myoutput.txt', 'w', encoding='utf-8') as f:
        for line in cur:
            f.write(line)
    

    好吧,但是光标不返回字符串行。它返回一行(我猜是元组)元素。因此,您可能必须这样做:

    with open('myoutput.txt', 'w', encoding='utf-8') as f:
        for row in cur:
            f.write(repr(row))
    

    这可能足以用于诊断目的。如果您需要更好的字符串,则必须以某种特定方式对其进行格式化。

    另外,你写道:

                         charset="utf8",
                         use_unicode=True)
    

    如果使用charset,则可以省略use_unicode=True(使用charset 暗示了这一点。如果我没记错的话,charset='utf8' 不是 Python 的任何公认编码。你必须使用charset='utf-8' -- 即在utf8 之间使用破折号或下划线。更正: utf8 可能是别名之一。

    更新基于 cmets...

    由于文件的输出似乎没问题,问题与用于输出print 命令的窗口的功能有关。由于cmd 只知道cp437,您必须使用另一个窗口(例如某些GUI 的支持Unicode 的窗口),或者您必须告诉cmd 使用另一种编码。请参阅experience of others。基本上,你必须告诉控制台:

    chcp 65001
    

    将接受的输出编码更改为 UTF-8,或者您可以使用支持所需字符的另一种(非 Unicode)编码。此外,控制台字体应该能够显示字符(即包含字形、字符的图像)。

    【讨论】:

    • 你知道解决问题的方法吗?您的描述非常好,非常感谢,但我需要一个解决方案。
    • 将结果写入文件时,是否也会出现错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2019-04-09
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多