- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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/
我在服务器上创建了一个 JSONP 函数并像这样返回一个 UTF-8 编码的 json 对象 applyLocalization({"Name":"%E5%90%8D%E5%89%8D","Age":
我正在开发一个应用程序,在该应用程序中我从API获取数据,并且正在获取这样的汉字 “u9c9cu82b1u548cu7231” 鲜花和爱 如何转换? 最佳答案 您的字符串采用转义的unicode格式。
好吧,我已经有了这个正则表达式,用于我网站上允许的名称。但是,我还希望添加名称可能使用的其他字母。有人有好的 regex 或知道如何使它更完整吗?我已经搜索了一段时间,但找不到适合我需要的内容。 这是
好吧,我已经有了这个正则表达式,用于我网站上允许的名称。但是,我还希望添加名称可能使用的其他字母。有人有好的 regex 或知道如何使它更完整吗?我已经搜索了一段时间,但找不到适合我需要的内容。 这是
本文实例讲述了Yii框架多语言站点配置方法。分享给大家供大家参考,具体如下: 这里假设我们要建立 中文/英文 切换的站点 1. 设置全局默认的语言 文件添加代码:protected/confi
我想知道如何设置编码参数,以便当我下载文本时,它“看起来”与我在网络浏览器中的页面源代码中看到的一样,例如: readLines("http://www.baidu.com/s?wd=r+projec
我计划开发一个 web 应用程序,它将使用一种新颖的方式来帮助人们学习汉字并记住它们的含义。 由于我不想/不能花费数年时间手动翻译所有中文字符,我想知道是否有(最好是开源的)数据库(任何形式)提供此功
我知道我的问题已经在这里有了解决方案。但我只想具体说明我的情况。我有一个 json 对象,其中包含非英语字符。 例如。 {“my_chinise_name”:“吉米”}。 该对象将通过 javascr
我有一个设置,其中邮件服务器(postfix)收到的电子邮件被处理,生成的电子邮件的正文(html或纯文本)和附件被解析为单独的文件并保存,为此我使用javax mail api。 当电子邮件正文为中
我的 settings.py 看起来像这样: LANGUAGES = ( ('en', _('English')), ('fr', _('French')), #Simplif
在我的图表中,x轴需要显示中文,y轴需要显示英文,但x轴显示困惑的代码。有人可以帮助我吗? self.chart.createDefaultAxes() axis_x, axis_y = self.c
使用Python3和BeautifulSoup v4 url='http://www.eurobasket2015.org/en/compID_qMRZdYCZI6EoANOrUf9le2.seaso
我的开发应用程序名称为中文。今天我从 CoreData 收到错误: CoreData: warning: Unable to load class named '゚ᆪンレ.' for enti
我正在用 java 编写一个 rss feed 解析器,在解析包含阿拉伯文/中文/日文字符的 feed 时遇到了问题。 Example feed 当我打印它们时,我只是得到一组问号“?????? ??
在我的一个Python程序(python 2.7)中,我需要处理一些汉字: 我有一个文件A.txt,它有两列:“name”和“score”,“name”列可以取一些中文字符串,score是一个1 到
我正在学习使用 eclipse 和 ADT 插件在 Android 上开发应用。 根据android SDK 文档中的这篇文章http://androidappdocs.appspot.com/res
我有这样的中文文字:“回家” - 好像是英文的“house”。 我去 google.com,在搜索中输入“回家”并得到这样的 url: http://www.google.ru/... q=%E5%9
我正在为我的应用程序添加中文支持。 我有这条线可以对英语和其他语言进行排序 NSSortDescriptor *sortByItem = [NSSortDescriptor sortDesc
我读日语,想尝试处理一些日语文本。我使用 Python 3 尝试了这个: for i in range(1,65535): print(chr(i), end='') 然后 Python 给了
我想将文本框值翻译成特定语言,如西类牙语、中文、德语等,它们都在下面的下拉列表中,我想在标签中显示文本框翻译值,但不在标签中显示翻译值。 English J
我是一名优秀的程序员,十分优秀!