Python Unicode Ajax 表单提交错误
我遇到了一个初学者的问题,关于Python的,我在这里找了很久也没找到合适的解决办法……
我有一个UTF-8格式的表单,通过AJAX发送到一个Python页面。我用UTF-8字符集读取JSON数据。
只要文本中没有混合使用UTF-8和拉丁字符,比如一些符号如?!;等,文本都是正常的。
但是我遇到了一个错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 0: ordinal not in range(128)
commentjsonarray = simplejson.loads(commentjson, encoding='utf-8')
我试了很多方法,但就是无法解决这个问题。求助。
这是我更新的内容,附上更多代码以便帮助,谢谢
commentjson = request.POST['commentObj']
commentjsonarray = simplejson.loads(commentjson, encoding='utf-8')
program = get_object(Program, commentjsonarray['programid'])
userget = get_object(User, commentjsonarray['userid'])
#get user avatar from usermeta
usermeta = get_object(UserMeta, 'user_id = ',userget.key())
commenttext = commentjsonarray['walltext']
from django.utils.encoding import smart_unicode,force_unicode,smart_str
commenttext = smart_str(commenttext)
newcomment = db_create(Wall, user_avatarurl=str(usermeta.avatarurlsmall),user_fullname=str(''+userget.first_name+' '+userget.last_name),user_idstring=str(userget.key()),text = str(commenttext) , program_id = program.key() , user_id = userget.key())
上面是Python的部分。接下来是JavaScript:
var walltext = $('walltext').value
var commentObj = {"walltext": ""+walltext+"", "programid": programid, "userid": userid};
var commentJSON = encodeURIComponent(Object.toJSON(commentObj));
if (walltext != '' || walltext == 'type here' || walltext.length > 0) {
new Ajax.Request('/wall/new', {
method: 'post',
encoding: 'UTF-8',
parameters: 'commentObj=' + commentJSON,
onSuccess: function(request){
var msg = request.responseText.evalJSON();
if (msg) {
var structure = '<div id="' + msg.msgid + '"><img src="' + msg.avatarurl + '" width="18" height="18"> ' + msg.username + ':' + msg.text + '<div id="frontSepLine"></div></div>';
//$('programwall').insert({bottom:structure});
refreshWall(msg.programid);
$('walltext').value = 'type here';
var objDiv = document.getElementById("programwall");
objDiv.scrollTop = objDiv.scrollHeight;
}
}
});
1 个回答
1
你描述的情况在我这边运行得很好(使用的是Python 2.6的标准库json
),无论是否明确指定编码(对于utf-8编码的字节串来说,其实不需要指定,因为utf-8是默认的):
>> s = u'{"valá":"macché?!"}'.encode('utf8')
>>> json.loads(s)
{u'val\xe1': u'macch\xe9?!'}
>>> json.loads(s, encoding='utf-8')
{u'val\xe1': u'macch\xe9?!'}
而且在simplejson 2.1.1上也能正常工作(在2.6上其实有点多余,不过没关系;-):
>>> import simplejson
>>> s = u'{"valá":"macché?!"}'.encode('utf8')
>>> simplejson.loads(s)
{u'val\xe1': u'macch\xe9?!'}
>>> simplejson.loads(s, encoding='utf-8')
{u'val\xe1': u'macch\xe9?!'}
你能更准确地描述一下你的问题吗?你提到的错误触发条件,比如“只要没有混合的utf8和拉丁字符,比如?!;等”,其实并不会导致任何问题——那么能不能给我们一个最小的例子,来展示一下确实会重现你问题的情况呢?