编码问题
程序员文章站
2022-07-14 17:34:21
...
最近用ajax做点小东西,但是这恼人的编码问题一直若隐若现的,真摸不太透。反正认死了一个理,前台后台都是utf-8准没错,试试看,果然没错,但是这是为啥呢?咱就有关坏毛病,总爱刨根问底就算不全挖出来吧,也得看见过根生什么色的吧。
于是乎,我开始测试测试。先测试什么呢?先从简单的开始吧。
首先创建个 testA.jsp
测试一下,没有问题。
在弄个html页面 TesxA_Ajax.html(注:这里用了jquery的ajax库,偷懒下直接copy官方的例子实现ajax,怎么实现无所谓)
测试一下,也没问题。
那我一点点改了
先去掉
这样改了之后,浏览器会根据系统当前编码去设置字符集。
直接访问testA.jsp,正常.
再访问 testA_ajax.html,乱码了. 在google半天知道了,xmlhttp默认编码是utf-8,我在response未设置过字符集所以他才找默认的。
再试试,
结果都不用看,这样测试等于没测试。
刚刚不是说了吗,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" 属性就可以了!
于是乎,我开始测试测试。先测试什么呢?先从简单的开始吧。
首先创建个 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" 属性就可以了!