中文乱码问题解决大全

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;
 
public class SetCharacterEncoding implements Filter {
 
    @Override
    public void destroy() {    
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
           FilterChain chain) throws IOException, ServletException {
       // 设置字符编码
       request.setCharacterEncoding( "UTF-8" );
       // 将控制传到下一个过滤器,如果没有过滤器则传到被调用者
       chain.doFilter(request, response);
    }
 
    @Override
    public void 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 传参。
?         form 表单提交方法是 get
< form action="registerProcess.jsp" method="get">
?         在超链接中传递中文参数:
< 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 不生效,才考虑方法六。

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(“ 源编码 ”),” 目标编码 ”)

你可能感兴趣的:(职场,J2EE,休闲)