您的位置:首页 > 其它

ajax中文乱码最终解决,网页乱码问题心得

2008-09-22 20:42 513 查看
用过ajax的人都会碰到中文乱码,网上基然有很多方法,但看完之后,很多人仍然解决不了乱码问题,为什么有的网页始终都会返回乱码,不管怎么设置呢?本人经研究终于解决,其实是个很原理的问题,但因为现在不知道底层原理而做高级应用是主流人群,所以会有很多人不知道,包括我自己.

说到网页的编码,要分两分部分,一部分是网页文档本身的编码,就是你用记事本打开,另存为时,可以选ANSI或utf-8,这是文档本身的编码,另一种是声明的编码,就是我们程序写的,如asp的Response.Charset="GB2312",这是告诉其它程序本文是用什么编码,而Response.Charset="GB2312",这句话的作用其实只是在html的头文件(head)里面加上了Content-Typ : text/html; Charset=GB2312这样一句话,xmlhttprequest,或MSXML2.serverXMLHTTP,或者IE都是通过分析这个头文件来决定自己用什么编码来解析这个文档

如果我们的文档是用utf-8存的,那么我们的头文件就要写Content-Typ : text/html; Charset=utf-8这样在转输过程中就不会错,不对应就会出现乱码

所以,如果我们要访问的文件是utf-8保存的,我们就要写Response.Charset="utf-8",如果是GB2312保存的,我们就要写Response.Charset="GB2312",因这ajax里面的组件默认是用utf-8解析,所以用utf-8保存的文件不用特别声明,但gb2312保存的文件要特别声明

我们的IE如果中文版的话,默认是用GB2312来解析,所以你的客户端网页文件要是gb2312保存的,如果是utf-8,则你要特别声明一下

下面说一下静态页html

我们虽然设了<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,但这并不会改变html的头文件,html的头文件并不是所谓的<head>标签里面的东西,那是给IE看的,html文档的头文件默认是Content-Type : text/html,所以,如果html是用gb2312存的,那用ajax是怎么也不能显示中文的.为了解决这个问题,就必需在iis设置 里面加个头文件,Content-Typ : text/html;
Charset=gb2312

就可以了

记事本ANSI如果是中文版 ,就是代表gb2312

如果你无法修改服务端的内容,如果出现乱码,就不要用responseText 用responseBody

因为responseBody是流文件,我们可以进行编码转换,responseText 是转换后的文本,无法再进行转换了

代码如下

getPromotionInfo=BytesToBstr(XMLHTTP.responseBody, "GB2312")

Function BytesToBstr(strBody,CodeBase)

dim objStream

set objStream = CreateObject("Adodb.Stream")

objStream.Type = 1

objStream.Mode =3

objStream.Open

objStream.Write strBody

objStream.Position = 0

objStream.Type = 2

objStream.Charset = CodeBase

BytesToBstr = objStream.ReadText

objStream.Close

set objStream = nothing

End Function

一般的动态网页,我们是可以修改头文件的,所以我们在接收utf-8服务端回传的文符串时,ajax可以判断头文件来显示正确的文字.

如果我们无法改变文件的头文件,那我们只有把接收到的流文件转换成我们需要的格式.

现在我们说说ajax给服务端发送数据,

我们有很多页面是gb2312的,我们要给utf-8的服务器端发数据时,我们要urlencode,对于.net的服务端而言,他可以接受utf-8或gb2312的两种urlcode,所以我们要做的是

如果我们是gb2312页面,我们就要用gb2312的方式进行urlencode,如果是utf-8页面,就要用utf-8的方式进行urlencode.

本人亲试,对于js程序,gb2312的网面,用escape进行urlenocde,对于utf-8,可以用encodeURI() 或encodeURIComponent() 方法,两者的区别是编码的范围不同,encodeURIComponent() 要更多一点.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: