Java web中编码问题解析
来源:互联网 发布:健步走软件官方下载 编辑:程序博客网 时间:2024/05/20 08:44
相信写过java web程序的人都对乱码恨之入骨,多少好心情就是因为乱码弄得一团糟,就像千里之体溃于蚁穴、一个老鼠害一锅汤一样的感觉!!!
这里,分享一下我对java web编码的认识,以及乱码的解决方法。
当一个用户从浏览器端发送一个HTTP请求时,这是需要一系列的编码:URL、Cookie、Paramiter。URL就是浏览器地址栏里的网页地址,Cookie先不说,Paramiter是我们要发送到服务器的各种参数。
当服务器接收到这个HTTP请求时,服务器需要进行一系列的解码。
当服务器处理完请求时,要发送一个Response给用户的浏览器,这时又要需要进行编码。
用户的浏览器收到这个Response,再进行解码,把结果呈现给用户。
好了,这就是一个HTTP请求中涉及到的编解码,其中如果编码与解码用的不是同一种编码,那就会出现乱码了。
那我们就依次分析其中乱码原因和解决方案:
一、表单的get方式提交
<form action="query" method="get">请输入查询学生名字:<input name="queryName" type="text"/><input type="submit" value="查询"/></form>上面的表单就是一个“get”方式提交的表单,当表单以这种方式提交时,浏览器会把参数按照页面上charset中的编码进行编码,网页中一般会有content="text/html; charset=UTF-8"这样一句话,如果没有,一般默认使用“ISO-8859-1”这种编码方式。当参数编码后发送到服务器,服务器进行解码,服务器解码使用的编码一般可以进行设置,对于Tomcat服务器,默认是ISO-8859-1,所以如果页面以“UTF-8”编码,发送给服务器后,使用String queryName=request.getParameter("queryName");来获取参数一般会出现未知字符。
对于编码“ISO-8859-1”,就像一个黑洞,中文字符进去后,要想正常的解码出来,就要用准确的编码进行解码。这里有一个万能的方法:
String queryName=new String(request.getParameter("queryName").getBytes("ISO-8859-1"),"utf-8");当页面的charset是“utf-8”时,用上面的语句可以正确获得中文参数,如果是其他编码,就把上面语句的最后一个参数替换成页面的charset值。
二、表单的post方式提交
这种方式提交的参数,首先浏览器会按照页面的charset属性进行编码,发送到服务器端后,服务器端也按照request请求中的charset属性进行解码,所以一般post提交上来的参数不会出现乱码问题,但是,有时候request中的charset属性是null,这是服务器就会使用默认的“ISO-8859-1”进行解码,造成乱码。
如何解决呢?首先要设置request中charset属性,而且必须在服务器解析参数之前,也就是在
request.getParameter("queryName");这句话之前设置charset属性,设置charset属性的语句是:
request.setCharacterEncoding("utf-8");一定要在获取参数之前设置charset属性
三、网页中存在带中文参数的链接
<a href="query?queryName=刘昂 ">查询</a>这种情况,浏览器首先按照页面的charset进行编码,发送到服务器,服务器按照自身设置进行解码,这个过程和“get”表单是一样的,所以解决方法也是一样的,万能解决语句:
String queryName=new String(request.getParameter("queryName").getBytes("ISO-8859-1"),"utf-8");四、数据库存储
数据库也经常出现乱码情况,至于这种情况,我在http://blog.csdn.net/zsmj_2011/article/details/7943734中写了关于mysql乱码原因和解决方法,可以参考一下
还有一种解决方法,就是在数据库连接字符串中添加参数:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8
正常的数据库连接字符串是没有后面的参数的,这种方法我没有真正实践过,不知道是否正确。
总结一下:
1.出现乱码时不要着急,关键找准乱码出现的点,然后对症下药。如何找到乱码发生的点呢?debug一下,这个不用多讲了,或者使用System.out.println,在使用到参数的地方都把参数先打印出来,很轻松找到乱码出现的点,然后对症下药。
2.保持一个好的编码习惯,页面要设置pageEncoding、charset等着写属性,而且要编码一致,数据库和服务器的编码设置也很重要,尽量与页面的编码一致。
3.尽量全部使用utf-8的编码。为什么不用gb2312、gbk、gb18030呢,我只想说,改革开放都30年了,要走出国门,面向世界,请使用Unicode编码。至于这几种编码的区别,可以再查查,utf-8十分适合网络编程中使用,因为编码采用变长技术,不会浪费字节。
- Java web中编码问题解析
- java web中文编码问题(ajax中编码问题)
- 解析WEB开发编码问题
- 解析WEB开发编码问题
- 解析WEB开发编码问题
- 解析WEB开发编码问题
- java web 编码问题
- Java web 编码问题
- java web 编码问题
- java web项目中所遇到的编码问题
- Java Web中遇到中文编码乱码问题
- 【零碎JAVA】web-编码问题
- java web中的编码问题
- java web中文编码问题
- 编码(三):Java Web编码问题
- Java Web 编码问题:jsp的编码问题
- 编码(二):Java中编码问题
- Jsp中几个编码问题的解析
- Ajax文本框输入提示
- Oracle帐号基本管理
- Apache Struts1 End-Of-Life (EOL)
- ANDROID4.0音频系统HAL初探
- 应用服务器监控-jwebap
- Java web中编码问题解析
- android程序退出功能解决方案——android完全退出
- asp.net 按钮动态添加事件
- vim 打开文件乱码解决方法
- 大数相乘
- 从现在开始,写写博客吧
- 怎样关闭域用户电脑中的趋势杀毒软件
- mac下svn问题——“.a”(静态库)文件无法上传解决
- 关于C语言编程中include的用法