我用AJAX POST数据时,汉字出现乱码,怎么解决
我用AJAX POST数据时,汉字出现乱码,怎么解决 问题点数:20、回复次数:37Top
1 楼chinahuman(铁匠)回复于 2006-03-03 15:09:17 得分 0
应该是设置一下你的XML的编码就可以搞定了吧?把UTF-8改成GB2312Top
2 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 15:56:24 得分 0
我是得到的responseTextTop
3 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 15:56:49 得分 0
你们难道没有遇到过这样的问题吗,奇怪Top
4 楼chinahuman(铁匠)回复于 2006-03-03 16:00:23 得分 5
指的是你得到的返回值?responseText
两三年前我也碰到过,怎么解决我倒是忘了。不过告诉你一个我现在想出来的方法就是先把它urlencode,到客户端后再decode肯定没有这个问题了Top
5 楼chinahuman(铁匠)回复于 2006-03-03 16:02:22 得分 0
帮你搜索了一下:http://beenhero.com/这个里面有你要的内容,我的网络太差了,看不到里面的具体东西。
其中有一个方法就是我上面说的:)Top
6 楼jasonboy(骑着小猪看夕阳)回复于 2006-03-03 16:54:44 得分 0
返回页面escape
接收页面unescape
Top
7 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 17:31:00 得分 0
接收页面接收到参数后就要存入数据库了
JS的unescape方法用不上了Top
8 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 17:43:15 得分 0
我在用JSP在接收AJAX POST方式传递的参数时汉字出现乱码Top
9 楼orrin(orrin)回复于 2006-03-04 10:22:12 得分 0
有一个简单的办法,就是在请求路径中加一个随机参数,就不会能中文乱码问题了,根本彻底的解决方法是在apache中进行配置,具体方法忘记了。Top
10 楼orrin(orrin)回复于 2006-03-04 10:22:58 得分 0
晕,这好像是asp版,IIS不知道如何配置。Top
11 楼emu(月亮不在手指尖上)回复于 2006-03-06 00:42:49 得分 5
用AJAX POST数据,是不能指定编码格式的,只能用utf-8,所以第一建议是前后台都统一用utf-8.
如果不能改变编码格式,就只能手工编码,把汉字用gbk编码后用urlencode方式发送出去。通常我们用vbscript做gbk编码(呵呵也就是Asc()啦),但是受到的限制是非IE浏览器不支持vbscript,而且在繁体中文系统下vbscript编码的结果似乎是big-5编码。
为了兼容繁体系统和非IE浏览器,也可以用javascript做gbk编码,这样基本上就要用字典法来编码了,因为unicode和gbk之间似乎没有简单的函数关系。javascript做gbk编码的方法可以参考我写的 http://www.blogjava.net/emu/articles/31756.html
用escape/unescape也是可以考虑的方法,不过要注意escape的结果和urlencode的结果一样是用“%”作为转义符的,因此escape的结果如果要按照字符串形式接收的话“%”需要重新编码。Top
12 楼keanfly(fly)回复于 2006-03-06 09:17:30 得分 0
var city = f.username.value; //document.getElementById("username").value;
var state= f.userpass.value; //document.getElementById("userpass").value;
//document.form1.userpass.value=city;
var url = "./TestAjaxSub.jsp?username=" + city+"&userpass="+state; //对应于Get
-------------------------------------------------------------修改上述几个地方。然后在TestAjaxSub.jsp中按照JSP通常解决中文乱码的方式来解决。我测试过了,正常。
Top
13 楼kill8108(日月之光)回复于 2006-03-07 16:30:25 得分 0
在post前,设定一下编码为utf-d,到服务器上同时设置一下编码,这样就可以了呢!
emu(回到csdn) ( ) 信誉:177 这种方法也是常见的呢!Top
14 楼cds27(http://blog.csdn.net/cds27/)回复于 2006-03-08 11:20:26 得分 0
发送的时候用xml dom发送,接收的时候用xml dom接受,返回继续用xml dom。
全程用xml就不会有编码问题了。Top
15 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-08 11:40:49 得分 0
Decode一下?Top
16 楼xuzuning(唠叨)回复于 2006-03-08 16:09:43 得分 0
xmlhttp总是用utf-8编码发送数据的,你需要在服务器端做转码处理。
Top
17 楼Scarroot(每天一贴,把分用完.)回复于 2006-03-08 16:22:46 得分 0
markTop
18 楼youys(youys)回复于 2006-03-08 21:59:09 得分 0
我是这样解决的,我把每一个HTML文件或ASP文件都以UTF-8保存,当在文件内容说明也用UTF-8.在发送的参数前都用escape()就行了,没有任何问题。同时在IE,FIREFOX中都行,不在自己进行编码的转换。Top
19 楼hax(海曦)回复于 2006-03-09 02:09:07 得分 5
补充emu等同志的:
1. 首先,基本上所有浏览器都是按照rfc等标准,优先考虑服务器端发送的content-type中所指定的encoding的,所以如果你要从服务器取得内容,尽量在服务器端指定好content-type。在这方面,Apache做的非常好。其默认设置上会为xxx.gb发送gb2312的头,为xxx.utf8发送utf-8的头,为xxx.big5发送big5的头。你甚至可以直接访问xxx,Apache会自动为浏览器选取最合适的版本发送。如果你使用Servlet/JSP开发,则使用Filter也可以非常简单的做到同样的事情。相对来说,IIS/ASP就很困难,ASP.NET应该有方法,但我不熟悉它,有熟悉的同志可作补充。
2. 浏览器发送信息方面,笼统的说,参数会根据该页面本身的编码进行url编码(变成形如%xx%xx的形式)。细节如下,当网页编码是unicode时(utf-8或utf-16),一律采用utf-8并url编码发送。否则:FireFox根据网页的content-type所指定的编码对网页中的链接进行url编码;表单方面,FF支持html规范所规定的form上accept-charset属性,会根据该属性的第一个可用的编码进行编码,若无该参数则根据网页的content-type所指定的编码进行url编码。MS IE不支持accept-charset,仅根据网页的content-type所指定的编码对网页中的表单进行url编码;对于链接的url(不包含query部分)默认始终以utf-8进行url编码,但链接的query部分则不进行url编码直接以原始字节发送。正是这样不一致的行为造成很多麻烦。
3. XMLHttpRequest发送时,你应该用encodeURI和encodeURIComponent方法对参数进行编码,这两个js函数始终使用utf-8进行编码。若不编码就传递的情况如何我没有测试过。
4. BCP 最佳实践的建议
a. 静态文件绝对不要用中文文件名,因为在不同操作系统上的不同server处理都不一样,而且可能存在bug(如iis)。
b. html、css和js尽量采用带有BOM的utf-8。这样统一使用utf-8是最佳选择。
c. 所有链接不应直接写中文,而应直接写成encodeURI之后的样子。
d. 凡是涉及中文的表单,假如在一个非unicode的页面中,如果不是约定(如某个站点统一使用gb2312),则提交的时候最好以各种方式加上encoding的提示。例如加入额外的http头(如果可能的话),附带一个enc参数,提交到一个特别的地址(如xxx.action.gb)。。。总之给服务器端以提示。Top
20 楼mingxuan3000(铭轩)回复于 2006-03-09 08:41:11 得分 0
markTop
21 楼emu(月亮不在手指尖上)回复于 2006-03-10 01:26:47 得分 2
>>但链接的query部分则不进行url编码直接以原始字节发送
汉字没有所谓的“原始字节”哦,始终都需要以某中方式编码存在的。在javascript中默认的编码方式应该是unicode(fromCharCode和escape的输出都是)。
query部分发送的时候如果没有编码,似乎浏览器会按照页面当前的编码方式进行urlencode编码成%xxTop
22 楼emu(月亮不在手指尖上)回复于 2006-03-10 01:28:48 得分 0
注意到楼主在二楼就说了“我是得到的responseText”呵呵,原来和标题说的是两回事啊。
把文字内容用xml包装起来,声明一下encoding为正确的编码方式,浏览器应该可以解析得出来的。Top
23 楼hax(海曦)回复于 2006-03-10 02:41:46 得分 1
我指的原始字节是指IE对于链接的query部分(通过网页链接或者直接在浏览器地址栏输入)是不进行任何urlencode的,即发送的并不是%xx。web server收到的就是未经任何处理的字节,如果网页是gb的,则收到的就是gb编码的字节,如果网页是utf-8则收到的就是utf8编码的字节,如果是从地址栏直接输入,则是系统默认编码即gb的字节。至少在我的XP IE6上是如此。这种处理方式其实很奇怪,按理说是违背HTTP协议标准的,不过多数server还是能接收的。Top
24 楼waterboy(流水男孩)回复于 2006-03-11 14:23:05 得分 0
>>emu(月亮不在手指尖上)
用AJAX POST数据,是不能指定编码格式的,只能用utf-8,所以第一建议是前后台都统一用utf-8.
--- req.xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=GB2312');Top
25 楼afoskoo(暂停打印)回复于 2006-03-11 15:26:09 得分 1
按照顺序,open 调用完毕之后要调用send 方法。send 的参数如果是以Post 方式发出的
话,可以是任何想传给服务器的内容。不过,跟form 一样,如果要传文件或者Post 内容给
服务器,必须先调用setRequestHeader 方法,修改MIME 类别。如下:
http_request.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
这时资料则以查询字符串的形式列出,作为sned 的参数,例如:
name=value&anothername=othervalue&so=onTop
26 楼wujunsong(宇豪)回复于 2006-03-11 19:24:45 得分 1
'用途:UTF-8编码和GB2312编码互转ASP代码,兼容英文和数字
function gb2utf(szInput)
Dim wch, uch, szRet
Dim x
Dim nAsc, nAsc2, nAsc3
If szInput = "" Then
unic = szInput
Exit Function
End If
For x = 1 To Len(szInput)
wch = Mid(szInput, x, 1)
nAsc = AscW(wch)
If nAsc < 0 Then nAsc = nAsc + 65536
If (nAsc And &HFF80) = 0 Then
szRet = szRet & wch
Else
If (nAsc And &HF000) = 0 Then
uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
szRet = szRet & uch
Else
uch = "%" & Hex((nAsc \ 2 ^ 12) Or &HE0) & "%" & _
Hex((nAsc \ 2 ^ 6) And &H3F Or &H80) & "%" & _
Hex(nAsc And &H3F Or &H80)
szRet = szRet & uch
End If
End If
Next
gb2utf = szRet
end function
function utf2gb(UTFStr)
for Dig=1 to len(UTFStr)
if mid(UTFStr,Dig,1)="%" then
if len(UTFStr) >= Dig+8 then
GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
Dig=Dig+8
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
next
utf2gb=GBStr
end function
function ConvChinese(x)
A=split(mid(x,2),"%")
i=0
j=0
for i=0 to ubound(A)
A(i)=c16to2(A(i))
next
for i=0 to ubound(A)-1
DigS=instr(A(i),"0")
Unicode=""
for j=1 to DigS-1
if j=1 then
A(i)=right(A(i),len(A(i))-DigS)
Unicode=Unicode & A(i)
else
i=i+1
A(i)=right(A(i),len(A(i))-2)
Unicode=Unicode & A(i)
end if
next
if len(c2to16(Unicode))=4 then
ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode)))
else
ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode)))
end if
next
end function
function c2to16(x)
i=1
for i=1 to len(x) step 4
c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
next
end function
function c2to10(x)
c2to10=0
if x="0" then exit function
i=0
for i= 0 to len(x) -1
if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
next
end function
function c16to2(x)
i=0
for i=1 to len(trim(x))
tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
do while len(tempstr)<4
tempstr="0" & tempstr
loop
c16to2=c16to2 & tempstr
next
end function
function c10to2(x)
mysign=sgn(x)
x=abs(x)
DigS=1
do
if x<2^DigS then
exit do
else
DigS=DigS+1
end if
loop
tempnum=x
i=0
for i=DigS to 1 step-1
if tempnum>=2^(i-1) then
tempnum=tempnum-2^(i-1)
c10to2=c10to2 & "1"
else
c10to2=c10to2 & "0"
end if
next
if mysign=-1 then c10to2="-" & c10to2
end functionTop
27 楼wujunsong(宇豪)回复于 2006-03-11 19:36:01 得分 0
然后在javascript中调用,如:
//客户端响应鼠标双击事件
function myRowDblClicked(grid,ev)
{
var GName = "张三";
GName = gb2utf(GName);
window.location='StockState.aspx?SName='+ GName;
}
StockState页面接收时
后台用:
txtGoodName.Text = System.Web.HttpUtility.UrlDecode(Request["GName"].ToString());
Top
28 楼sage6437()回复于 2006-03-12 16:29:59 得分 0
xmlObj.open ('POST', url, true);
xmlObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlObj.send (file);
看看是否有第二句?
xmlObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");Top
29 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-12 19:40:55 得分 0
用JS escape一下数据,再用C# Server.UrlDecode搞一下Top
30 楼emu(月亮不在手指尖上)回复于 2006-03-13 17:13:01 得分 0
waterboy(流水男孩):
再次做试验确认了 setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=GB2312'); 确实无法改变XMLHTTP发送数据时候的编码方式。Top
31 楼SaRoot(新风机)回复于 2006-03-14 11:03:38 得分 0
我是这样读数据的,没有出现乱码,而且也带中文
//读出用户传入的xml字符串
System.IO.Stream stream = Request.InputStream;
System.IO.BinaryReader br = new System.IO.BinaryReader(stream, System.Text.Encoding.Default);
int len = int.Parse(stream.Length.ToString());
byte[] b = br.ReadBytes(len);Top
32 楼liangsx(liangsx)回复于 2006-03-15 08:36:37 得分 0
asp文件是加Response.CharSet="gb2312"Top
33 楼dearmite(笨笨的我*_^)回复于 2006-03-15 10:54:25 得分 0
终于也有一个人碰到和我一样的问题了。
呵呵,
上面写什么只是设页页为GR2312的全没试过。
问题出在JS在传递汉字的时候,就已经是乱码。
很多WEB服务器本身设定一下就可以,
比如TOMCAT,JBOSS,WEBLOGIC,
等等,
但是我在APACHE下就不行。
等正解Top
34 楼hqulyc((vc++++++++...死循环了))回复于 2006-03-15 11:10:27 得分 0
responseText得到的字符编码是你Apache和php ini文件中的字符编码设定的一样.
如apache中的编码设定为gb2312,那么responseText的编码也为gb2312
eg:DefaultChatset gb2312.
我倒是没试过将Apache和php ini中的默认编码各设定为不同的编码,看得到的编码会是哪个设定的
Top
35 楼hqulyc((vc++++++++...死循环了))回复于 2006-03-15 11:11:26 得分 0
至于页面设定为GR2312,那只是页面浏览字符的方式.Top
36 楼wjh6of6agriculture(艰苦奋斗)回复于 2006-05-28 15:16:17 得分 0
谢谢wujunsong(宇豪) 老大!我刚接触AJAX,把你的函数拷过去就搞定了。。。。。Top
37 楼Scarroot(每天一贴,把分用完.)回复于 2006-05-29 22:04:23 得分 0
markTop




