使用ajax提交中文数据到Django时出现乱码

grok 2011-10-10 10:25:39
我是使用JQuery内置的ajax异步请求到Django,由于传的数据有中文,所以到了Django后台后数据由于编码的问题,出现了类似乱码的结果(如:u'%25u9648%25u65B9%25u94ED'),Python的默认编码我已经设置为utf-8,而且在views.py文件头部使用了#-*- coding: utf-8 -*-,JQuery里加了contentType:"application/json; charset=utf-8",GET、POST方式我都试过了,而且我还分别用encodeURIComponent、escape对中文进行了处理,但是到了Django后他它就是类型乱码,而且数据类型为<type 'unicode'>,我用decode解码,也是一样,各位谁遇见过这种情况,麻烦给我个思路。谢谢!
...全文
440 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2011-10-10
  • 打赏
  • 举报
回复
你的http请求没有问题。贴下django相关的代码看下。
另外回答下7楼的问题。
grok 2011-10-10
  • 打赏
  • 举报
回复
我所说的乱码时ajax请求到Django后台时,后台把这些返回到前台时变成了乱码
grok 2011-10-10
  • 打赏
  • 举报
回复
这是Headers
(Request-Line) POST /doSubmitHostData/ HTTP/1.1
Accept application/json, text/javascript, */*
Accept-Encoding gzip, deflate
Accept-Language zh-cn
Cache-Control no-cache
Connection Keep-Alive
Content-Length 196
Content-Type application/json; charset=utf-8
Host 127.0.0.1:8000
Referer http://127.0.0.1:8000/zjgl/
User-Agent Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)
x-requested-with XMLHttpRequest
这是Stream:
Referer: http://127.0.0.1:8000/zjgl/
Accept: application/json, text/javascript, */*
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)
Host: 127.0.0.1:8000
Content-Length: 196
Connection: Keep-Alive
Cache-Control: no-cache

IP=111.110.120.119&TelnetMode=32&TelnetPort=44&FtpMode=12&FtpPort=55&ProgramPath=C%3A%5Cfakepath%5C263EM-0819.rar&HostName=%E5%A4%A9%E9%BE%99%E5%85%AB%E9%83%A8&SubsName=%E9%99%88%E6%96%B9%E9%93%AD
iambic 2011-10-10
  • 打赏
  • 举报
回复
另外我一直没看到你说的“乱码”是在哪里出现的乱码。是发到后台的数据就有乱码,还是在django里做了些处理后的结果(比如解析json)有乱码,还是存到数据库里有乱码,还是返回到用户网页里有乱码。
iambic 2011-10-10
  • 打赏
  • 举报
回复
你给的这些信息完全说明不了任何问题。
我前面说了,把http request的完整信息贴出来看下。
包括http status line,headers,以及未解码过的post data。
grok 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iambic 的回复:]
这个数据到底是哪来的?如果是浏览器发过去的,请用httpfox或者firebug或者类似的抓包工具,把HTTP Request内容贴出来看下(必须准确无误贴出来,否则无法令人信任)。
[/Quote]
您好!非常感谢您,我按照您的提示,用HttpWatch抓包,证实了如果我在ajax那边不用对汉字进行编码处理的话,那中文是能传送的如:
FtpMode 13
FtpPort 58
HostName 天龙八部
IP 111.110.120.119
ProgramPath C:\fakepath\WPSetup.exe
SubsName 中国人
TelnetMode 46
TelnetPort 79
但是如果我在ajax那边对汉字进行处理的话,就会出现类似的乱码,照这么说来,那应该是Django这边接收的问题了??
iambic 2011-10-10
  • 打赏
  • 举报
回复
这个数据到底是哪来的?如果是浏览器发过去的,请用httpfox或者firebug或者类似的抓包工具,把HTTP Request内容贴出来看下(必须准确无误贴出来,否则无法令人信任)。
grok 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iambic 的回复:]
另外要分清楚什么叫乱码。你那个u'%25u9648%25u65B9%25u94ED',在我看来就是url转义过的数据。不是什么乱码。
[/Quote]
是ajax提交数据到Django后台时候它就已经转换了编码了,但是我不清楚ajax提交的数据是采用什么编码?
iambic 2011-10-10
  • 打赏
  • 举报
回复
另外要分清楚什么叫乱码。你那个u'%25u9648%25u65B9%25u94ED',在我看来就是url转义过的数据。不是什么乱码。
iambic 2011-10-10
  • 打赏
  • 举报
回复
什么“#-*- coding: utf-8 -*-”,“application/json; charset=utf-8”,都是无目的的乱搞。
你先搞清楚数据是在哪一步出现问题的。如果你能看到哪一步有问题,自然是手到病除。否则纯属瞎蒙。
iambic 2011-10-10
  • 打赏
  • 举报
回复
你这个信息应该不是repr(bbs)的错误。只有准确知道repr(bbs)的内容,才好进一步分析。
grok 2011-10-10
  • 打赏
  • 举报
回复
我现在是用urllib2.unquote()这个处理的,不知道您还有没有好办法??
grok 2011-10-10
  • 打赏
  • 举报
回复
谢谢您,我搞掂了!
grok 2011-10-10
  • 打赏
  • 举报
回复
TypeError at /doSubmitHostData/
coercing to Unicode: need string or buffer, type foundRequest Method: POST
Request URL: http://127.0.0.1:8000/doSubmitHostData/
Django Version: 1.3
Exception Type: TypeError
Exception Value: coercing to Unicode: need string or buffer, type found

D:\ss\..\IMS\views.py in doSubmitHostData
156. SubsName=urlquote(SubsName)157. HostName=HostName.encode("utf-8")158. SubsName=SubsName.encode("utf-8")159. nameType=type(HostName)160.161. #HostName=HostName.decode("gbk").encode("utf-8")162. #SubsName=SubsName.decode("gbk").encode("utf-8")163. bbs="IP:"+IP+"|||"+"TelnetMode:"+TelnetMode+"|||"+"TelnetPort:"+TelnetPort+"|||"+"FtpMode:"+FtpMode+"|||"+"FtpPort:"+FtpPort+"|||"+"ProgramPath:"+ProgramPath+"|||"+"HostName:"+HostName+"||"+"SubsName:"+SubsName+"|||"+nameType+"{{"+host+"}}"+"{{"+subs+"}}"+"{}{}{}{}[][][]"+h ...164. con=MySQLdb.connect(host="127.0.0.1",port=3306,user="root",passwd="123",db="imsdb",charset='utf8')165. cursor=con.cursor()166. #cursor.execute("INSERT INTO `imsdb`.`mod_host` (`HOST_ID`, `IP_ADDR`, `HOST_NAME`, `SUBS_NAME`, `SUBS_PASSWORD`, `FTP_PORT`, `FTP_MODE`, `TELNET_MODE`, `TELNET_PORT`, `FLAG`, `CONFIG_ADDR`) VALUES('10', '"+IP+"', '"+HostName+"', '"+SubsName+"', 'C', "+FtpPort+", "+FtpMode+", "+TelnetMode+", "+TelnetPort+", 0, '"+ProgramPath+"');")167. #con.commit()168. con.close()169. return HttpResponse(bbs)▶ Local vars
Variable Value
nameType <type 'str'>
subs "u'\\u9648\\u65b9\\u94ed'"
FtpMode u'22'
h u'\u5929\u9f99\u516b\u90e8'
HostName '%E5%A4%A9%E9%BE%99%E5%85%AB%E9%83%A8'
FtpPort u'56'
ProgramPath u'C:\\fakepath\\down_7394.exe'
SubsName '%E9%99%88%E6%96%B9%E9%93%AD'
host "u'\\u5929\\u9f99\\u516b\\u90e8'"
TelnetMode u'30'
IP u'127.0.0.1'
request <WSGIRequest
GET:<QueryDict: {}>,
POST:<QueryDict: {u'FtpMode': [u'22'], u'IP': [u'127.0.0.1'], u'HostName': [u'\u5929\u9f99\u516b\u90e8'], u'FtpPort': [u'56'], u'SubsName': [u'\u9648\u65b9\u94ed'], u'ProgramPath': [u'C:\\fakepath\\down_7394.exe'], u'TelnetMode': [u'30'], u'TelnetPort': [u'42']}>,
COOKIES:{},
主要就是给bbs赋值的那一行抛出异常,就是没把unicode转换过来
iambic 2011-10-10
  • 打赏
  • 举报
回复
先贴出来看看。总比什么都不贴强。
grok 2011-10-10
  • 打赏
  • 举报
回复
Django如果出现异常就会抛出一个异常页面,里面有很多信息,您是要那个页面的信息吗?
iambic 2011-10-10
  • 打赏
  • 举报
回复
贴完整异常信息。

我没用过httpwatch。你不是能拿到请求信息吗?怎么拿不到相应信息?
grok 2011-10-10
  • 打赏
  • 举报
回复
但是我现在执行到Django后台那边bbs的值由于是多个值的相加值,而且有unicode,所以bbs抛出异常,我注释bbs,输出repr(request.POST["HostName"])、repr(request.POST["SubsName"])的值为:u'\u5929\u9f99\u516b\u90e8'u'\u9648\u65b9\u94ed',不过用httpwatch怎么看我不知道?能教教我吗?
iambic 2011-10-10
  • 打赏
  • 举报
回复
首先把repr(request.POST["HostName"])的结果贴出来看下。再把repr(bbs)的结果贴出来看下。
然后把你的http response的全文贴出来看下(用你之前的HttpWatch)。
grok 2011-10-10
  • 打赏
  • 举报
回复
def doSubmitHostData(request):
#request.CharSet = "UTF-8"
IP=request.POST["IP"]
TelnetMode=request.POST["TelnetMode"]
TelnetPort=request.POST["TelnetPort"]
FtpMode=request.POST["FtpMode"]
FtpPort=request.POST["FtpPort"]
ProgramPath=request.POST["ProgramPath"]
HostName=request.POST["HostName"]
SubsName=request.POST["SubsName"]
#SubsName='chan'
# HostName=urlquote(HostName)
#SubsName=urlquote(SubsName)
HostName=HostName.encode("utf-8")
SubsName=SubsName.encode("utf-8")
nameType=type(HostName)
#HostName=HostName.decode("gbk").encode("utf-8")
#SubsName=SubsName.decode("gbk").encode("utf-8")
bbs="IP:"+IP+"|||"+"TelnetMode:"+TelnetMode+"|||"+"TelnetPort:"+TelnetPort+"|||"+"FtpMode:"+FtpMode+"|||"+"FtpPort:"+FtpPort+"|||"+"ProgramPath:"+ProgramPath+"|||"+"HostName:"+HostName+"||"+"SubsName:"+SubsName+"|||"+nameType
con=MySQLdb.connect(host="127.0.0.1",port=3306,user="root",passwd="123",db="imsdb",charset='utf8')
cursor=con.cursor()
#cursor.execute("INSERT INTO `imsdb`.`mod_host` (`HOST_ID`, `IP_ADDR`, `HOST_NAME`, `SUBS_NAME`, `SUBS_PASSWORD`, `FTP_PORT`, `FTP_MODE`, `TELNET_MODE`, `TELNET_PORT`, `FLAG`, `CONFIG_ADDR`) VALUES('10', '"+IP+"', '"+HostName+"', '"+SubsName+"', 'C', "+FtpPort+", "+FtpMode+", "+TelnetMode+", "+TelnetPort+", 0, '"+ProgramPath+"');")
#con.commit()
con.close()
return HttpResponse(bbs)7楼所问的乱码时指这里返回的时候是乱码,而且我现的问题就是Django这边该如何处理ajax提交过来的数据,我注释的有一部分就是我在Django这边处理,高手看看该怎么处理??

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧