1

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

4

2 回答 2

3

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

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

于 2012-10-10T10:52:46.403 回答
1

问题可能是环境的输出编码设置为 cp437 并且 unicode 字符无法转换为该编码,而这样做print(line)可能会转换为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)

如果使用,charsetuse_unicode=True可以省略(使用暗示_ _工作,因为它是别名之一。charsetcharset='utf8'charset='utf-8'utf8utf8

更新基于评论...

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

chcp 65001

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

于 2012-10-10T10:53:31.217 回答