今天在调试 jElement.js
(我用jQuery做的一个使用js生成Form的类)时,发现汉字返回有问题,是乱码,后来发现是simpleJson把utf-8编码的字符串直接转
成了unicode,但却是按字节来转的,不是真正的unicode。看来使用simpleJson时要小心,一定要转为unicode后再传给它。可是
这样很不方便,因此我写了一段小程序,可以自动判断要处理的数据,包括:普通字符串,Unicode字符串,List,Tuple(自动转为List),
字典,它可以根据情况来进行递归处理,直到将所有的字符串都转为Unicode。而且还将HttpResponse给封装进去了,这样可以直接在View
中返回了。代码为:from django.http import HttpResponsefrom django.utils import simplejsonfrom django.conf import settingsdef json(data): encode = settings.DEFAULT_CHARSET return HttpResponse(simplejson.dumps(uni_str(data, encode)))def uni_str(a, encoding): if isinstance(a, (list, tuple)): s = [] for i, k in enumerate(a): s.append(uni_str(k, encoding)) return s elif isinstance(a, dict): s = {} for i, k in enumerate(a.items()): key, value = k s[uni_str(key, encoding)] = uni_str(value, encoding) return s# elif isinstance(a, str):# return unicode(a, encoding) elif isinstance(a, str) or (hasattr(a, '__str__') and callable(getattr(a, '__str__'))): if getattr(a, '__str__'): a = str(a) return unicode(a, encoding) elif isinstance(a, unicode): return a else: return a使用如:import Ajaxdef index(request): return Ajax.json(data)请注意,为了发贴我将所有花括号都替换成了全角字符,如想使用请自行转换。Update 2006/09/20: 在使用Django时,发现对于翻译出来的字符串,isinstance不正确,因此增加了判断对象是否存在一个__str__方法的处理,这样就基本上没有问题了。没有增加对__unicode__的处理,一般都不定义这个方法。 |