web开发过程中总是会遇到一些中文乱码问题,今天做了一些汇总,不足的地方大家指正
1.我们开发中会碰到一些中文乱码,如"涓€浜屼笁鍥涗簲鍏"一堆繁体字,这个错误很可能是你用gb2312来解析一堆utf-8的字节
如果中文乱码是"口口口口???",这个错误很可能是你用utf-8来解析一堆gb2312字节
2.asp.net中webconfig没有特别配制的话,response流,request解析方式,都是utf-8格式,除非你特殊配制如下
<globalization responseEncoding="gb2312" requestEncoding="gb2312" />
一但这样配制了,你的aspx页面的输出流就是gb2312编码,网页头文件也是gb2312,和你的文件保存格式,或者是否在aspx里面写上
<meta http-equiv="content-type" content="text/html;charset=utf-8">都没有关系
3 <globalization responseEncoding="utf-8" requestEncoding="utf-8" fileEncoding="utf-8"/>里面的fileEncoding是用来强制文件保存格式的,如上的配制,如果你用gb2312来保存aspx文件,那这个页面打开时会出现乱码,但我不知道是否有这样的业务需求.
4 我们常常会碰到一个问题,当我们在IE手敲一个url如"http://localhost:2568/WebForm1.aspx?a=板砖是枯" 我们会发现页面上有乱码,而如果点击同样url的链接,就没有乱码,这是什么呢?因为在中文window系统里面,我们手敲的字是GB2312编码的,而服务器端的request是用utf-8来解析的,所以就会有乱码.而网页上的链接的指向的url的编码格式,是和response流的编码格式一致的.
而form表单里面的数据是根据网页来的,和手敲无关.
5.在代码里面写HttpWebRequest,请求的地址是以utf-8的编码发出去的,和webconfig配制无关,晢时还不知道哪里设制请求流的编码格式
6
对于html页面
如果htnl页面是用gb2312保存,如果没有特殊配制,IE默认用GB2312解析,如果写了
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
ie用utf-8解析,会出现乱码,如果你用的是vs2008的IDE,你在html页面上写了
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
那么,软件会自动把你的html文件存成带签名的utf-8.
如果你的html页面是用带签名的utf-8存的,那么你写不写
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
IE都会用utf-8编码来解析.
7
js
如果网页是utf-8,js是gb2312存的且有中文,<script src="JScript1.js"></script>的话,js会不执行或报奇怪错误
所以要 <script src="JScript1.js" charset="gb2312"></script> charset值要和js的编码一致.
如果网页是用gb2312的编码,js是用utf-8存的,则charset写不写,都会正确执行
8 ajax
最麻烦的就是这里了
先讲访问不带参数的url
ajax会根据收到的数据流里面的头文件来判断该用什么编码来解析收到的数据流,如果头文件没有指定,则默认用utf-8来解析数据流
所以如果用ajax来访问html,txt页面,就要把html.txt存成utf-8格式.
而我们在写asp,php的时候要写Response.Charset来写明编码格式,但注意这仅仅是说明编码格式,还不是设置编码格式.数据流的编码
格式不会因为设置了Response.Charset而改变.
对于aspx页面来讲,一般不用考虑这个问题,不管是utf-8还是gb2312都会在头文件里面声明.
再说带参数的url
ajax在中文IE中是用GB2312编码格式来发送url请求的,用utf-8来发送post请求,而火狐是用utf-8来发送url请求,用gb2312来发送post请求,完全相反.
当我们知道服务端用utf-8来request的时候,我们要用js里面的encodeURIComponent,encodeURL来把中文转换成utf-8格式的url编码
如"%e4%b8%ad%e5%9b%bd "(中国)
如果我们知道服务端用gb2312来request的时候,我们要用自己写个程序来把中文转换成gb2312格式的url编码如"%d6%d0%b9%fa"(中国)
如果我们是服务端,webconfig里面配制的requestencoding是utf-8,而对方发出的请求是gb2312,我们可以用
NameValueCollection gb2312Requests;
gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
Response.Write(gb2312Requests["string"]);
这种方法来接收.
当然,有一种极端的情况,就是对方是用asp或php写的页面,没有进行urldecode,同时用utf-8来接收数据,同时不接收post数据
我们一定要用IE游览器,我就要把中文先用utf-8来编成字节,再用gb2312来组合字节形成乱码,再把乱码当参数传出去,那边才能解析
而js做编码转换很麻烦,网上有很多方法,这里就不说了,也许我们都碰不上这种情况吧.
附:js的gb2312 urlencode
<script type="text/vbscript">
<!--
function str2asc(strstr)
str2asc = hex(asc(strstr))
end function
function asc2str(ascasc)
asc2str = chr(ascasc)
end function
'-->
</script>
<script type="text/javascript">
function urlEncode(str)
{
var ret = "";
var strSpecial = "!/"#$%&’()*+,/:;<=>?[]^`{|}~%";
var tt = "";
for(var i = 0; i < str.length; i++)
{
var chr = str.charAt(i);
var c = str2asc(chr);
tt += chr + ":" + c + "n";
if (parseInt("0x" + c) > 0x7f)
{
ret += "%" + c.slice(0,2) + "%" + c.slice(-2);
}
else
{
if (chr == " ")
ret += "+";
else if (strSpecial.indexOf(chr) != -1)
ret += "%" + c.toString(16);
else
ret += chr;
}
}
return ret;
}
做为接收端,要是无法决定发送端的参数可以这样,C#
Encoding.GetEncoding("utf-8").GetString(Encoding.GetEncoding("gb2312").GetBytes(aa.ToCharArray()))
进行utf-8和gb2312转换
我们可以要求客户端在url里面加个encoding=天,如果我们request["encoding"]=="天"我们就不做转换,如果不是"天"我们就做转换