欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编码问题

程序员文章站 2022-07-14 17:34:21
...
     最近用ajax做点小东西,但是这恼人的编码问题一直若隐若现的,真摸不太透。反正认死了一个理,前台后台都是utf-8准没错,试试看,果然没错,但是这是为啥呢?咱就有关坏毛病,总爱刨根问底就算不全挖出来吧,也得看见过根生什么色的吧。
      于是乎,我开始测试测试。先测试什么呢?先从简单的开始吧。


首先创建个 testA.jsp

<%@ page contentType="text/html; charset=GB2312"%>
<%
request.seCharacterEncoding("GB2312");
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
</head>

<body>

<%
out.print("我是中文");
out.print("<br>")
out.print("我真的是中文");
%>
</body>
</html>


测试一下,没有问题。

在弄个html页面  TesxA_Ajax.html(注:这里用了jquery的ajax库,偷懒下直接copy官方的例子实现ajax,怎么实现无所谓)

<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  
  <script>
  $(document).ready(function(){
    $("#myt").load("testA.jsp");  <!-- 就是把 id为myt的div标签读取testA.jsp页面 -->
  });
  </script>
  <style>body{ font-size: 11px; font-family: Arial; }</style>
</head>
<body>
  <b>jQuery Links:</b>
<div id="myt"></div>
</body>
</html>


测试一下,也没问题。


那我一点点改了
先去掉
request.seCharacterEncoding("GB2312");

这样改了之后,浏览器会根据系统当前编码去设置字符集。
直接访问testA.jsp,正常.
再访问 testA_ajax.html,乱码了. 在google半天知道了,xmlhttp默认编码是utf-8,我在response未设置过字符集所以他才找默认的。

再试试,
request.seCharacterEncoding("utf-8");

结果都不用看,这样测试等于没测试。
刚刚不是说了吗,utf-8不能正常显示,又这样设置,再回头看看testA.jsp,连他都给乱码了。
哎,网上不是说统一换成utf-8就OK了,为啥我换半天都不成,反而换成gb2312就没问题。

汗颜,少做了一件事情。
用记事本打开testA.jsp , 然后另存为 保存的时候选择一下 编码 格式为utf-8。

再试试看,终于OK了,真是够罗嗦的,要不是看见大家都赶时髦走国际化用上了utf-8,我干脆前后都是gb2312就完事了。


折腾了半天,有几个结论:
1.<meta http-equiv="Content-Type" content="text/html; charset=GB2312">此句都是为浏览器所用,浏览器根据它选择以后编码方式。而request.seCharacterEncoding("utf-8");是通过web服务器改变http头中的编码集,如果为空则默认为utf-8编码,所以才出现上文所说的gb2312正常而默认便出现乱码的情况了。根据http协议,他所传输的数据带有http头,http头包含字符集标识,也就是说所传输的数据需要用哪种字符集才可以解析。
2.我们利用request.seCharacterEncoding("utf-8");
做的字符集设置,实质上是更改字符输出选择的字符集,而真正显示字符的是testA.jsp,testB.jsp等文本文件,所以要设置其编码方式,否则即便再如何设置字符集也没有任何效果。
3.总之,前台显示数据的文本文件的编码方式,要能够解析后台数据所设置的字符集,才可正常显示。(ps:默认的编码是ansi,即在中文环境下就是gb2312,在日文环境下就是jis。所以默认的文本文件格式是ansi,是不能解析utf-8字符的)

顺便说一下jsp中的get参数传递只要在tomcat的server.xml,配置端口那项 Connector 增加一个
URIEncoding="UTF-8" 属性就可以了!