为什么中文在使用webpy时会出现乱码,而使用MySQLdb却很正常?

2024-05-17 16:06:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在mysql中创建一个数据库,并使用webpy构建我的web服务器。在

但是对于汉字来说,webpy和MySQLdb分别使用它们访问数据库时的行为却很奇怪。在

以下是我的问题:

我的表t_测试(utf8数据库):

id     name
1      测试

“reiprequi试”的utf8代码是:\xe6\xb5\x8b\xe8\xaf\x95

当使用MySQLdb执行如下“选择”操作时:

^{pr2}$

结果正常,打印:

    items=(127L, '\xe6\xb5\x8b\xe8\xaf\x95'), name=测试

但当我使用webpy时,请执行相同的操作:

    db = web.database(dbn='mysql', host="127.0.0.1", 
             user='test', pw='test', db='db_test', charset="utf8")
    eval_items=db.select('t_test')
    comment=eval_items[0].name
    print "comment code=%s"%repr(comment)
    print "comment=%s"%comment.encode("utf8")

出现中文错误,打印结果为:

    comment code=u'\xe6\xb5\u2039\xe8\xaf\u2022'
    comment=忙碌鈥姑€

我知道webpy的数据库也依赖于MySQLdb,但这两种方式是完全不同的。为什么?在

顺便说一句,出于上述原因,我可以直接使用MySQLdb来解决我的汉字混淆问题,但是它丢失了表中的列名称——这太不像话了。我想知道如何用webpy解决它?在


Tags: nametestweb数据库dbmysqlcommentitems
1条回答
网友
1楼 · 发布于 2024-05-17 16:06:13

事实上,一些非常错误的事情正在发生 正如您在评论中所说,unicode代表。“return试”的字节为E6B5 8BE8 AF95- 它在我的utf-8终端上工作:

>>> d
'\xe6\xb5\x8b\xe8\xaf\x95'
>>> print d
测试

但是看看你的“comment”unicode对象上的字节:

^{pr2}$

意思是你的部分内容是评论的utf-8字节 (字符表示为“\xYY”,部分编码为Unicode点 (以\uYYYY表示的字符)-这表示严重垃圾。在

MySQL有一些捕获可以正确解码(utf-8或其他编码) 其中一个是传递正确的“charset”参数 到连接处。但你已经这么做了-

您可以尝试将选项use_unicode=False传递给连接- 并在自己的代码中解码utf-8字符串。在

db = web.database(dbn='mysql', host="127.0.0.1", 
         user='test', pw='test', db='db_test', charset="utf8", use_unicode=False)

检查此参数和其他可能尝试的参数的连接选项:

http://mysql-python.sourceforge.net/MySQLdb.html

不管如何让它正常工作,根据上面的提示,我为您提供了一个解决方法,它看起来像Unicode字符(而不是Unicode对象中的utf-8原始字节) 其中一个字符串编码为: (“cp1258”,“cp1252”,“帕尔莫斯”,“cp1254”)

其中,cp1252与“latin1”几乎相同,后者是MySQL使用的默认字符集 如果它在连接中没有得到“charset”参数。但这不仅仅是个问题 web2py不把它传递给数据库,因为你得到了混乱的字符,不是吗 只是编码错误-这就好像web2py在来回地对字符串进行编码和解码,而忽略了编码错误

从所有这些编码中,我可以检索出您最初的“return试”字符串,作为utf-8字节字符串,例如:

comment = comment.encode("cp1252", errors="ignore")

所以,现在放置这行代码可能对您有用,但是使用unicode进行猜测从来都不是一件好事- proepr的作用是缩小web2py的范围,首先给你那些半解码的utf-8字符串,然后让它停止。在

更新

我在这里检查了-这就是所发生的事情-正确的utf-8 '\xe6\xb5\x8b\xe8\xaf\x95'字符串是从mysql中读取的,在将其传递给您之前,(在use_unicode=True的情况下)0-这些字节被解码,就好像它们是“cp1252”—这会产生不正确的u'\xe6\xb5\u2039\xe8\xaf\u2022'unicode。这可能是一个web2py错误,比如,它没有将“charset=utf8”参数传递给实际的连接。当您设置“use_unicode=False”而不是给您原始字节时,它显然选择了不正确的unicode,一个使用“utf-8”的dencode-这将产生 '\xc3\xa6\xc2\xb5\xe2\x80\xb9\xc3\xa8\xc2\xaf\xe2\x80\xa2'你在下面评论的序列(这更不正确)。在

总之,我上面提到的解决方法似乎是检索原始的、正确的字符串的唯一方法—也就是说,给定错误的unicode,do u'\xe6\xb5\u2039\xe8\xaf\u2022'.encode("cp1252", errors="ignore")—也就是说,缺少 做一些其他的事情来建立数据库连接(或者更新web2py或mysql驱动程序,如果可能的话)

**更新2** 我进一步检查了web2py dal.py文件中的代码,它试图将连接设置为默认的utf-8,但是看起来它会同时尝试MySQLdb和pymysql驱动程序(如果您都安装了请尝试卸载pymysql,只保留MySQLdb)。在

相关问题 更多 >