乱码问题思考及解决方法
一、引起乱码的原因有:
1、响应中的乱码:即显示页面上的乱码,如index.jsp显示出来时,"用户名"显示为乱码
2、表单提交时的乱码:即在表单的文本框中输入为中文的时候提交到服务出现乱码
二、针对各原因的解决思路及方法:
1、响应中的乱码:
说明:
(1).常见的编码方式:
ISO-8859-1,GB18030,GB2312,UTF-8;
(2)pageEncoding的含义:
pageEncoding表示的是该JSP页面的编码,也就是你要保存一个JSP页面,系统会以这个编码来保存(我们知道文本文件另存为的时候会弹出一个提示窗口,你细心一下就会发现原来可以选择不同的"编码"来保存),
同理,JSP文件默认保存的时候会以你设置的pageEncoding的属性值保存该JSP页面。
Eclipse中如果你设置了Window\preferences\jsp files面版上的Encoding为某一个值如GB2312,则以后新建一个JSP文件的时候系统会自动加上pageEncoding="GB2312"这一属性。
注意:pageEncoding="ISO-8859-1"的时候是不能保存中文的,就是说如果你设置为ISO-8859-1,但又想在JSP文件中写一段中文,保存文件的时候会提示不能保存。
(3)JSP实现过程:
客户提交URL请求如:www.WebTest.com/index.jsp
服务器接收到请求
服务器寻找本地文件index.jsp
服务器将index.jsp转译为index.java再编译为index_jsp.class文件,并将其作为响应发给客户端
客户端浏览器解释执行得到HTML代码并显示给客户
由上可见,要解决响应中的乱码问题要注意三点:
I、对本地文件index.jsp的pageEncoding属性检查,因为服务器接到请求后首先是找这个文件。pageEncoding可设为GB18030,GB2312,UTF-8
II、JSP使用 <%@ page contentType="text/html; charset=GB2312" %>为响应添加编码信息,这里如果charset="ISO-8859-1",显示出来的中文肯定是乱码。
III、记得在 <head> </head>中加入 <meta http-equiv="Content-Type" content="text/html; charset=GB2312">注意这句话应是在 <head>之后的首句话,因为有可能 <title> < /title>中使用了中文,
如果加在 </title>后,则title内容显示会出现乱码。这里的charset值最好与contentType中的charset值一致。
经过上面三步即可解决响应乱码即显示出来的页面中有乱码的情况。
2、表单提交乱码:
说明:
(1)表单的文本框中输入为中文的时候提交到服务出现乱码的主要原因是:表单提交即发送请求的过程中使用的编码是ISO-8859-1.
表单提交方式有POST和GET,所以表单提交乱码为POST乱码和GET乱码
I、POST乱码
解决方法是在JSP页面中加入语句: <% request.setCharacterEncoding("UTF-8"); %>
在web.xml中加入filter来转换所有的Post编码
II、GET乱码
POST方式下的解决方式还算简单,因为POST方式下提交的数据都是以二进制的方式附加在http请求的body部分发送,只需要在后台指定编码格式就足矣解决。
GET方式下会将参数直接附加到url后面,这部分参数无法使用request.setCharacterEncoding()处理,结果就是get形式的所有中文都变成了乱码。
这里只能对提交的内容转換成字节再转換成另一编码的字符:如下:
<%
String username = request.getParameter("username");
byte[] bytes = username.getBytes("iso-8859-1");
String result = new String(bytes, "gb2312");
out.print(result);
%>
理解起来很简单:首先我要获得与现有编码不同的编码的字符串,String类中构造函数:new String(byte[],charset ch); 那么现在我需要一个字节数组,即要对原来的字符串进行转换,从字符串变成字节数组,String类中的getBytes(charset ch)函数 所以结合起来就是:new String(username.getBytes("iso-8859-1"),"gb2312");
分享到:
相关推荐
在项目中发现这样一个问题:sqlserver数据库编码为gbk,使用python3.4+pymssql 查询,中文乱码,经过一番思考问题解决,下面把解决办法分享给大家: conn = pymssql.connect(host=192.168.122.141, port=1433, ...
实验1: 利用servlet实现一个简单的聊天室 实验目的 (1) 理解servlet的工作原理 (2) 掌握servlet编程基本技能 实验内容及要求 1. 利用servlet技术...1. 如何解决中文乱码的问题 2. 如何实现页面的自动刷新 jee 小练习
国内许多的朋友使用和学习ASP,遇到好程序的新手却因为代码经过编码而叹气的时候,这个工具刚好可以帮你解决这个问题。 她无汉字乱码问题;无缺少字符问题,而且还原速度快,纯32位软件,无需命令行输入,操作界面...
其中javascript向java类中传递值解决中文乱码问题是一个难点,该项目成功地解决了该问题。此外,组合查询时如何解决浏览器缓存也让我思考很久。希望它能够帮助到需要的人。另外,项目中的jar包是从官网下载最新后...
帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个...
首先我要恭喜你,遇见问题,意味着你又有涨经验的机会了,每解决一个问题,你的JAVA经验值就应该上升几百点,问题遇到的越多,知识提升的越快。 但是总是解决不了也是很恼人的,怎么办呢? 我一般要求我们的...
如何解决Android网络通信中的乱码问题? 在Android中如何使用语音服务和Google Map Apl? Android如何访问摄象头、传感器等硬件的APl? 如何时行Widget开发?如何用各种Android组件来打造漂亮的UI界面? ...
30.1.4 其他的安装方法/ 418 30.2 管理 Gitolite/ 419 30.2.1 管理员克隆 gitolite-admin 管理库/ 419 30.2.2 增加新用户/ 420 30.2.3 更改授权/ 422 30.3 Gitolite 授权详解/ 423 30.3.1 授权文件的基本语法/ 423 ...
全书一共被压缩为5个rar,这是第二个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
全书一共被压缩为5个rar,这是第五个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
全书一共被压缩为5个rar,这是第四个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
全书一共被压缩为5个rar,这是第三个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
DOS启动盘是目前我们最常用的DOS类工具,其中的一些命令和工具会帮助你解决不少问题。本文发表的目的就是想通过这些DOS启动盘,让“菜鸟”朋友们有一个对DOS亲身体验和初步了解。我不是DOS高手(绝非nnmm谦虚),...
这种预先判断的处理方式,很大的程度上解决了非法输入对后面的存储所带来的一系列问题。 <p><B> </B></P> <p><B>3) </B><B>DelAll</B><B>模式(清空购物篮) </B></P> 这...
解决的这个问题的办法是调整。最后还是老师帮我帮我们找到了问题的所在——for 循环的次超过了链表中结点的数量。再就是自定义函数时由于课本的概念不清楚,多写了空格键,以至函数调用不出来。又如:在设计修改学生...
C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。 3、请简述以下两个for循环的优缺点(5分) for (i=0; i; i++) { if (condition) DoSomething(); else DoOtherthing(); } if (condition) { ...