我遇到了python的n00b问题,我在这里搜索了一段时间,我找不到合适的解决方案......
我有一个utf8表单,我ajax发布到python页面。我用utf-8字符集阅读了json simplejson。
只要没有混合的utf8和拉丁字符,文本就可以了吗?!;等等......
UnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xd7:序号不在范围内(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;
}
}
});
答案 0 :(得分: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和latin chars就像?!;等”的反转,不会引起任何问题 - 那么向我们展示最微小的例子< em> 重现你的问题吗?