参考:

http://blog.csdn.net/beijiguangyong/article/details/7414247

http://www.zhihu.com/question/20212696

C4 中文乱码
JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法。
C4.1 HTML中文编码转换
在JSP文件中的静态文字显示乱码,则需要在<head></head>之间增加中文设置代码,如清单附C-5所示。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
charset指定UTF-8字符集,当然也可以指定其他支持中文的编码,如GBK和GB2312。但是整个Web应用中一定要统一一种编码,推荐统一为UTF-8编码。

C4.2 JSP中文编码转换
针对Tomcat下动态内容的中文乱码问题,有以下几个解决办法:
1. 在每个JSP文件的开头增加如下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
2. 设置编码参数:
request.setCharacterEncoding("UTF-8");
3. 使用编码过滤器。创建过滤器类SetCharacterEncoding,源码如清单附C-5所示。
清单附C-5 SetCharacterEncoding.java
package chapc;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
publicclass SetCharacterEncoding implements Filter {
@Override
publicvoid destroy() {
}
@Override
publicvoid doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//设置字符编码
request.setCharacterEncoding("UTF-8");
//将控制传到下一个过滤器,如果没有过滤器则传到被调用者
chain.doFilter(request, response);
}
@Override
publicvoid init(FilterConfig arg0) throws ServletException {
}
}
过滤器类还需要在web.xml中进行配置,设定要过滤哪些请求。过滤器在web.xml中的配置如清单附C-6所示。
清单附C-6 web.xml片段
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>chapc.SetCharacterEncoding</filter-class>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
方法1、方法2和方法3经常需要使用,但它们一般不是独立使用,而是两两结合:1和2结合;1和3结合。附录A中的示例用到了1和2的结合。第四章Hibernate中的信息发布系统用到了1和3的结合。
4. 修改Tomcat根目录中conf子目录下的server.xml文件,在中加入URIEncoding="UTF-8",如清单附C-7所示。
清单附C-7 server.xml片段
<Connector connectionTimeout="20000"
port="8080"
protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"/>
该方法用来解决浏览器地址栏中的传递中文参数导致的乱码问题。浏览器地址栏传递参数(URL传参)一般表现为三种情况:form表单的get方法提交、超链接传参和response传参。
1) form表单提交方法是get:
<form action="registerProcess.jsp" method="get">
2) 在超链接中传递中文参数:
<a href="a.jsp?p=中文参数">超链接传递中文参数测试</a>
5. 如果是调用response.sendRedirect传递中文参数产生的乱码,如:
response.sendRedirect("a.jsp?p=中文参数");
请修改成如:
<% //引入URLEncoder %>
<%@page import="java.net.URLEncoder"%>
<%
String p = "中文参数";
//对中文参数编码
p = URLEncoder.encode(p, "UTF-8");
response.sendRedirect("a.jsp?p=" + p);
%>
以解决乱码问题。
如果方法4还不能解决某些超链接传参乱码问题,请使用方法5,如下:
<%@page import="java.net.URLEncoder"%>
<%
String p = "中文参数";
//对中文参数编码
p = URLEncoder.encode(p, "UTF-8");
%>
<a href="a.jsp?p=<%=p %>">超链接传递中文参数测试</a>
6. JavaScript中如果出现URL传参乱码问题,如:
open("a.jsp?p=中文参数");
请修改成:
<script type="text/javascript">
function openWindow()
{
var url = "a.jsp?p=中文参数";
url = encodeURI(url);
open(url);
}
</script>
<input type="button" value="JavaScript中文参数"
onclick="openWindow();">
以解决乱码问题。
JavaScript中的open方法打开浏览器窗口,传递参数,其本质也是URL传参。一般方法4就可以很好的解决中文参数乱码问题。如果方法4不生效,才考虑方法6。

C4.3 MySQL数据库中文编码转换
在设定连接数据库URL时指定字符编码,可以确保数据正确的现实在网页上:
jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8;

C4.4 存在的问题与题外话
1. 存在问题
在第二节的第四部分提到了修改Tomcat根目录中conf子目录下的server.xml文件,以支持在URL中传递中文参数。
这种方法存在一个问题,就是Tomcat服务器下可能不止一个Web应用,而多个Web应用的编码又不一样,这个时候就不能修改server.xml了。可以尝试采用:
String p = new String(p.getBytes(“源编码”),”目标编码”)
源编码可以是:ISO-8859-1、GB2312和GBK等合法编码;
目标编码为:UTF-8、GBK和GB2312等合法编码。
用户在使用这个方法的时候需要确定源编码和目标编码各是什么,才能解决中文乱码问题。
2. 题外话
数据库的编码问题除了可以修改连接URL之外,也可以采用方法:
String p = new String(p.getBytes(“源编码”),”目标编码”)

java乱码问题(转)的更多相关文章

  1. java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")

    http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...

  2. java乱码问题处理

    java乱码问题处理 java乱码出现的问题有很多,这里主要解释tomcat,jsp,html,http(get,post请求乱码处理).常见的问题可能是tomcat,http请求乱码问题,对于jsp ...

  3. jsp页面传输到xxAction.java乱码解决

    jsp页面传输到xxAction.java乱码解决:jsp:encodeURI(encodeURI("xx"))java:if(!StringUtils.isBlank(belon ...

  4. java 乱码问题解决方案

    java  乱码问题解决方案 一.tomcat: <Connector         port="8080"         maxThreads="150&qu ...

  5. java 乱码问题-Dfile.encoding=UTF-8

    http://blog.csdn.net/telnetor/article/details/5555361 问题描述:程序涉及到国际化问题,httpclient抓回来的数据乱七八糟的乱码,在转了几次编 ...

  6. 深入解析java乱码

    1.什么是编码 ,为什么要编码 先前从没有思考这么深入的问题,觉得一切理所当然,直到有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它. 大家都知道,文本文件, ...

  7. java乱码详解(java中byte与char的转换)

    转自:http://hi.baidu.com/%C6%F3%D2%B5%BC%D2%D4%B0/blog/item/825a4858d6248e8b810a181a.html   java byte与 ...

  8. java 乱码问题集

    场景1:刚复制来的java类乱码,反复修改无果 解:将java类用NotePat++打开,可正常显示,复制过来即可.

  9. Java乱码解决之道

    1.常见字符编码 ASCII编码: ASCII,American Standard Code for Information Interchange,是基于拉丁字母的一套电脑编码系统,主要用于显示现代 ...

随机推荐

  1. Redis 安装与简单示例 01_转

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  2. AVAudioplayer时error解决 创建失败 ERror creating player: Error Domain=NSOSStatusErrorDomain Code=2003334207 "(null)"

    AVAudioplayer 有两个初始化方法: 1.[[AVAudioPlayer alloc] initWithData:musicData error&e]; 2.[[AVAudioPla ...

  3. ectouch第五讲 之表

    Ectouch本身相关的表 17个ecs_touch_activity[touch优惠活动扩展表] 优惠活动的自增id 取值ecs_favourable_activity表cat_id,给优惠活动加b ...

  4. C#:向控件添加信息类

    using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; names ...

  5. java产生随机数并求和

    设计思路: 先随机生成10个数,组成一个数组,然后用消息框显示数组内容,然后用循环计算数组元素的和,将结果也显示在消息框中. 程序流程图: 源程序代码: import javax.swing.*; p ...

  6. JavaScript中创建类,赋值给ajax中的data参数

    缘由:因为要给根据是否选中checkbox来动态增加ajax中data的属性(ajax的data属性格式的几种方法,参考http://www.jb51.net/article/46676.htm) d ...

  7. sql截断日志

    --收缩数据库 DBCC SHRINKDATABASE(fas) --截断事务日志: BACKUP LOG fas WITH NO_LOG 1.清空日志 DUMP TRANSACTION 库名 WIT ...

  8. 【转】Windows下搭建cvs服务器

    转载地址:http://hi.baidu.com/iloverobot/item/fad1eb6d66c45e166995e66d 下载cvs server:CVSNT 网址为:http://www. ...

  9. hdoj4906 Our happy ending(2014 Multi-University Training Contest 4)

    对于一个定长(size = n)的数列a, 若其存在“位置相关”的子集(含空集)使得该子集所有元素之和为k,那么将数列a计数. 其中数列a中任一元素a[i]在[0, l]内自由取值. 数据条件0≤n, ...

  10. Safecracker 分类: HDU 搜索 2015-06-25 21:12 12人阅读 评论(0) 收藏

    Safecracker Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...