之前项目有一个用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 的编码方式也多了一点了解