PyMySQL UnicodeEncodeError; python shell成功但cmd失败

时间:2012-10-10 08:21:31

标签: python-3.x cmd python ptvs

我是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的答案。

2 个答案:

答案 0 :(得分:3)

我的猜测是你收到的数据不是unicode,尽管你的python脚本试图用Unicode编码它。

我会检查数据库和表格特定字符集&amp;整理设置。 utf8&amp; utf8_general_ci是你的朋友。

答案 1 :(得分:1)

问题可能是环境的输出编码设置为cp437,并且在执行可能转换为print(line)的{​​{1}}时无法将unicode字符转换为该编码。

尝试通过写入文件替换循环内的self.old_out.write(value),如:

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不是已识别的Python编码。您必须使用charset='utf8' - 即charset='utf-8'utf之间的短划线或下划线。更正: 8可能因为它是别名之一。

根据评论

更新 ...

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

cmd

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