gpt4 book ai didi

python - 为什么用webpy中文乱码,用MySQLdb正常?

转载 作者:太空狗 更新时间:2023-10-30 00:17:55 26 4
gpt4 key购买 nike

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

但是分别使用webpy和MySQLdb访问数据库时,汉字的行为就很奇怪了。

下面是我的问题:

我的表 t_test(utf8 数据库):

id     name
1 测试

“测试”的utf8编码为:\xe6\xb5\x8b\xe8\xaf\x95

当使用 MySQLdb 做这样的“选择”时:

    c=conn.cursor()
c.execute("SELECT * FROM t_test")
items = c.fetchall()
c.close()
print "items=%s, name=%s"%(eval_items, eval_items[1])

结果正常,打印:

    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 解决它?

最佳答案

的确,一些非常错误的事情正在发生——正如您在评论中所说,unicode repr。 “测试”的字节是 E6B5 8BE8 AF95 -它适用于我的 utf-8 终端:

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

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

comment code=u'\xe6\xb5\u2039\xe8\xaf\u2022'

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

MySQL 有一些技巧可以正确解码(utf-8 或其他)编码其中的文本 - 其中之一是传递适当的“字符集”参数到连接。但你已经这样做了 -

您可以做的一种尝试是向连接传递选项 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", "palmos", "cp1254")

其中,cp1252 几乎与“latin1”相同 - 这是 MySQL 使用的默认字符集如果它没有在连接中获得“字符集”参数。但这不仅仅是一个问题web2py 没有将它传递给数据库,因为你得到的是损坏的字符,而不是只是错误的编码——就好像 web2py 正在来回编码和解码你的字符串,并忽略编码错误

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

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

所以,放置这一行现在可能对你有用,但是用 unicode 来猜测永远都不好 -proepr 的目的是缩小让 web2py 为您首先提供那些半解码的 utf-8 字符串的范围,并让它停在那里。

更新

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

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

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

关于python - 为什么用webpy中文乱码,用MySQLdb正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13268061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com