之前项目有一个用django开发的简单的admin tool。 现在由于 要加入对中国客户的支持, 所以要有显示与编辑中文。
由于是直接操作数据库, 所以显示没有问题, 但是在编辑的时候, 出现 'ascii' codec can't decode byte 0xe7 in position 20: ordinal not in range(128)的错误。
于是来debug这个问题, django提供了丰富的debug trace。 看到是一个打log的地方出现的问题。
说是在对query_string进行decode的时候出现错误。
开始在网上google, 有的说是用decode("gbk").encode('utf-8'), 发现不管用
为了 先能work, 用了try...catch...的机制, 如果出现错误就不打印log.
下面是慢慢的找原因了。
其中 Python Unicode与中文处理(文摘) 对python的unicode , utf-8及其他讲解的不错。
然后看到说decode 与encode有第二个参数可以对error进行不同的处理。
于是尝试了一下decode("gbk","ignore").encode("ascii","ignore")发现不报错了, 不过具体的query_string就看不到了。
由于 python默认的编码方式是unicode, 所以在处理string(%s)时候会自动的用unicode来decode, 如果我们指定用自然字符 来处理不知道, 可不可以 。
尝试了一下
就可以了。
问题解决。
对python 的编码方式也多了一点了解
在使用Django开发的admin工具中,为支持中文显示和编辑,遇到'ascii' codec解码错误。通过调试发现错误源于对query_string的处理。尝试了使用decode("gbk").encode('utf-8')未果,最终采用try...catch...避免错误打印。了解到Python的Unicode处理和编码方式,通过decode("gbk","ignore").encode("ascii","ignore")解决了报错问题,但query_string内容丢失。采用%r%r格式化输出解决了问题,同时加深了对Python编码的理解。"
137670056,10727098,"Python TypeError错误详解:Int object, Unhashable Type, Unsupported Operand
750

被折叠的 条评论
为什么被折叠?



