好东西:我要收藏.http://blog.donews.com/limodou/archive/2006/09/14/1037959.aspx.

今天在调试 jElement.js (我用jQuery做的一个使用js生成Form的类)时,发现汉字返回有问题,是乱码,后来发现是simpleJson把utf-8编码的字符串直接转 成了unicode,但却是按字节来转的,不是真正的unicode。看来使用simpleJson时要小心,一定要转为unicode后再传给它。可是 这样很不方便,因此我写了一段小程序,可以自动判断要处理的数据,包括:普通字符串,Unicode字符串,List,Tuple(自动转为List), 字典,它可以根据情况来进行递归处理,直到将所有的字符串都转为Unicode。而且还将HttpResponse给封装进去了,这样可以直接在View 中返回了。代码为:

from django .http import HttpResponse
from django .utils import simplejson
from django.conf import settings

def 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 Ajax
def index(request):
    return Ajax .json(data)

请注意,为了发贴我将所有花括号都替换成了全角字符,如想使用请自行转换。

Update 2006/09/20:

 在使用Django时,发现对于翻译出来的字符串,isinstance不正确,因此增加了判断对象是否存在一个__str__方法的处理,这样就基本上没有问题了。没有增加对__unicode__的处理,一般都不定义这个方法。


Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1037959

评论
发表评论

您还没有登录,请登录后发表评论