`
THELOG
  • 浏览: 4094 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

中文乱码问题

阅读更多

在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的JSP中文乱码问题有如下几个方面:页面乱码、参数乱码、表单乱码、源文件乱码。下面来逐一解决其中的乱码问题。

一、JSP页面中文乱码

JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。

先看一个JSP程序:

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*"  %>  
  2. <html>  
  3.     <head>  
  4.     <title>中文显示示例</title>  
  5.   
  6.     </head>   
  7.     <body>  
  8.     这是一个中文显示示例:  
  9.     <%  
  10.         String str = "中文";  
  11.         out.print(str);  
  12.     %>  
  13.     </body>  
  14. </html>  

 

 

上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。运行后在浏览器中显示如图所示

原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代码中page命令修改成如下所示即可

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %>  
  2. <html>  
  3.     <head>  
  4.     <title>中文显示示例</title>  
  5.   
  6.     </head>   
  7.     <body>  
  8.     这是一个中文显示示例:  
  9.     <%  
  10.         String str = "中文";  
  11.         out.print(str);  
  12.     %>  
  13.     </body>  
  14. </html>  

 

 

再次运行乱码消失,原理就是向页面指定编码为GB2312,那么页面就会按照此编码来显示,于是乱码消失。

二、URL传递参数中文乱码

一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。

下面是一个示例程序

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>  
  2. <html>  
  3.     <head>   
  4.         <title>URL传递参数中文处理示例</title>  
  5.     </head>  
  6.     <%  
  7.         String param = request.getParameter("param");  
  8.     %>  
  9.     <body>  
  10.         <a href="URLCharset.jsp?param='中文'">请点击这个链接</a><br>  
  11.         你提交的参数为:<%=param%>  
  12.     </body>  
  13. </html>  

 

 

上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图

对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcatconf目录下的server.xml配置文件,具体改后的代码如下

 

[html] view plain copy
 
 print?
  1. <Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312"  
  2.                connectionTimeout="20000"    
  3.                redirectPort="8443" />  

 

 

在原来代码中添加URI编码设置URIEncoding=gb2312”即可,重启Tomcat服务器可以得到正确的页面。其原理也和上面的情况类似,就是向程序指明编码类型,然后显示就正常了。

三、表单提交中文乱码

对于表单的数据可以使用request.getParameter(“”)的方法获取,但是当表单中出现中文数据的时候就会出现乱码。

示例代码如下

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>  
  2. <html>  
  3.     <head>     
  4.         <title>Form中文处理示例</title>  
  5.     </head>   
  6.     <body>  
  7.         <font size="2">  
  8.                 下面是表单内容:  
  9.             <form action="AcceptFormCharset.jsp" method="post">  
  10.                 用户名:<input type="text" name="userName" size="10"/>  
  11.                 密  码:<input type="password" name="password" size="10"/>  
  12.                 <input type="submit" value="提交">  
  13.             </form>    
  14.         </font>  
  15.     </body>  
  16. </html>  

 

 

在上面的表单当中想AcceptFormCharset这个页面提价两项数据,下面是AcceptFormCharset.jsp的内容:

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*"  
  2.     contentType="text/html;charset=gb2312"%>  
  3. <html>  
  4.     <head>  
  5.         <title>Form中文乱码</title>  
  6.     </head>  
  7.     <body>  
  8.         <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>  
  9.             <%  
  10.                 String userName = request.getParameter("userName");  
  11.                 String password = request.getParameter("password");  
  12.                 out.println("表单输入userName的值:" + userName + "<br>");  
  13.                 out.println("表单输入password的值:" + password + "<br>");  
  14.              %>   
  15.         </font>  
  16.     </body>  
  17. </html>  

 

 

在上面的程序中,如果表单输入没有中文,则可以正常的显示当输入的数据中有中文的时候,得到的结果如图所示。

产生种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题可以采用转换编码格式的方法来解决,现在对AcceptFromCharset这个页面改动如下:

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*"  
  2.     contentType="text/html;charset=gb2312"%>  
  3. <html>  
  4.     <head>  
  5.         <title>Form中文乱码</title>  
  6.     </head>  
  7.     <body>  
  8.         <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>  
  9.             <%  
  10.                 String userName = request.getParameter("userName");  
  11.                 String password = request.getParameter("password");  
  12.                 out.println("表单输入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "<br>");  
  13.                 out.println("表单输入password的值:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>");  
  14.              %>   
  15.         </font>  
  16.     </body>  
  17. </html>  

 

 

经过这样的转换编码以后,所有的中文输入都可以用request对象正常取出。在上面这个程序中,第四行和第五行是转换编码格式的关键,先从ISO-8859-1格式的字符串中取出字节内容,然后在用GB2312的编码格式重新构造一个新的字符串。这样就可以支持中文变淡输入的正常取值和显示。改进以后程序运行结果如下

经过上面的更改编码格式的处理,表单的中文输入乱码问题已经得到解决。但是如果上面的表单中的输入项不止是两个,那么每个输入项都需要进行编码转换,那样就很麻烦了。这是我们就用到了大名鼎鼎的过滤器filter了。关于这里的内容大致的思虑和上面的一样具体做法请参照笔者的另一篇文章

四、EclipseJSP文件中文乱码

Eclipse或者MyEclipse中由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP文件时会出现乱码,如图所示

对于这个问题我们只需要更改一下Eclipse或者是MyEclipse中对JSP的默认编码就可以了,修改的地方(我的MyEclipse版本为11)如图所示

PS

Eclipse或者MyEclipse当中JSP文件默认的编码为ISO-8859-1,所以在JSP代码中间如果出现中文就不能保存,例如如下代码

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*" %>  
  2. <html>  
  3.     <head>  
  4.     <title>中文显示示例</title>  
  5.   
  6.     </head>   
  7.     <body>  
  8.     这是一个中文显示示例:  
  9.     <%  
  10.         String str = "中文";  
  11.         out.print(str);  
  12.     %>  
  13.     </body>  
  14. </html>  

 

 

修改后在保存的时候会提示如下:

现这个提示的原因在于JSP源文件中有ISO=8859-1编码无法识别的中文字符,对于这个问题,解决办法就是在JSP页面中声明页面编码格式即可。声明后代码如下:

 

[java] view plain copy
 
 print?
  1. <%@ page language="java" import="java.util.*"  pageEncoding="GB2312" %>  
  2. <html>  
  3.     <head>  
  4.     <title>中文显示示例</title>  
  5.   
  6.     </head>   
  7.     <body>  
  8.     这是一个中文显示示例:  
  9.     <%  
  10.         String str = "中文";  
  11.         out.print(str);  
  12.     %>  
  13.     </body>  
  14. </html>  

 

 

其中第一行中pageEncoding=gb2312”指明了JSP页面编码采用GB2312,这样就可以正常保存JSP的源文件了。

 

遇到问题首先分析问题出现的原因,只有知道了原因才能去解决,学习分析问题的来源远比解决这个问题重要的多。

乱码问题的原因就是程序(Eclipse也好,浏览器也罢)的编码没有和编程人员的编码进行统一,(就像你和一个不懂中文的人用中文交流他当然不懂了)那么解决这个问题只需要将编程人员想要的编码告诉程序就可以了,以上解决乱码问题的种种方法都可以说是一种声明编码的过程,也就是说乱码问题终极解决方案就是:转码。这里的转码要么是编程人员手动转,要么就是声明一下让程序去转,换句话说就是:和不懂中文的交流,要么让他学中文,要么你就去学习他的语言。

生活就是编程,编程就是生活,同之,通之!!!

分享到:
评论

相关推荐

    中文乱码问题分析 自己总结的

    中文乱码问题分析 中文乱码问题是 Java 和 JSP 开发中的一种常见问题,主要是由于 Java 和 JSP 源文件的保存方式是基于字节流的,而编译成 class 文件过程中,使用的编码方式与源文件的编码不一致所致。在 Java ...

    hadoop中文乱码问题

    【Hadoop中文乱码问题详解】 在大数据处理领域,Hadoop是一个不可或缺的开源框架,它提供了分布式存储(HDFS)和分布式计算(MapReduce)的能力。然而,在处理包含中文字符的数据时,用户可能会遇到中文乱码的问题...

    解决JSP中文乱码问题

    解决 JSP 中文乱码问题 解决 JSP 中文乱码问题是一个很常见的问题,在 JSP 开发过程中,经常出现中文乱码的问题,可能一至困扰着大家。下面我们将详细讨论 JSP 中文乱码问题的成因和解决方法。 JSP 中文乱码问题的...

    sqlite3 for delphi 解决中文乱码问题

    "sqlite3 for delphi 解决中文乱码问题"这个主题,正是针对这一问题提供了解决方案。这里我们将详细探讨SQLite3在Delphi中的应用,中文乱码的成因,以及如何通过自定义修改来解决这个问题。 首先,SQLite3是一个轻...

    Ajax中文乱码问题解决方案

    然而,在处理中文字符时,Ajax请求可能会遇到乱码问题,这主要是由于编码格式不一致或者处理不当导致的。本文将深入探讨Ajax中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**...

    MySQL数据库系统中文乱码问题及解决方案.pdf

    MySQL数据库系统中文乱码问题及解决方案 MySQL数据库系统中文乱码问题是指在使用MySQL数据库系统时,中文字符在存储、传输和显示过程中出现乱码的问题。这种问题的出现是由于字符集和编码方式的不兼容所致。 在...

    java中文乱码问题详解--- java中文乱码问题详解

    ### Java中文乱码问题详解 #### 一、中文问题的来源与背景 计算机技术发展初期,操作系统主要支持单字节的ASCII字符集。随着全球化进程加快和技术进步,为支持多种语言,尤其是双字节编码的语言(如中文),提出了...

    使用ODBC中文乱码问题.docx

    ODBC中文乱码问题解决方案 在使用ODBC对数据库进行中文字符串插入时,经常会遇到中文字符串显示乱码的问题。本文将通过对该问题的分析和解决方案,帮助读者更好地理解ODBC中文乱码问题的成因和解决方法。 一、问题...

    ArcGIS 10.X导出dbf文件时出现中文乱码问题修复补丁.rar

    本压缩包文件“ArcGIS 10.X导出dbf文件时出现中文乱码问题修复补丁.rar”就是针对这个问题提供的一种解决方案。 标题中提到的“ArcGIS 10.X”指的是ArcGIS软件的10.x版本系列,这个系列包括10.0、10.1、10.2直至...

    editplus插件htmlFormatter.js解决中文乱码问题

    首先,我们了解下中文乱码问题的背景。在处理包含中文字符的HTML文件时,如果没有正确设置编码或者在格式化过程中编码转换不当,就可能出现中文乱码现象。这不仅影响代码的可读性,也可能导致程序运行错误。因此,...

    soapUI输入中文显示为乱码,响应报文中文乱码问题解决方法.txt

    soapUI输入中文显示为乱码 响应报文中文乱码问题解决方法

    struts 中文乱码问题解决

    在IT领域,特别是Web开发中,Struts框架作为Java Web应用的一个重要组成部分,其在处理中文字符时常常遇到乱码问题。这个问题不仅影响了用户体验,也增加了开发者的调试难度。本文将深入探讨Struts框架中中文乱码的...

    FORM表单中文乱码问题分析与解决

    FORM表单中文乱码问题分析与解决 在 Web 开发中,中文乱码问题是一个常见的问题,尤其是在FORM表单传递参数时。这个问题的根本原因是对中文的编码与解码方式不一致。我们可以理解为对中文的加密与解密的密钥不一致...

    JSP中文乱码问题解决办法

    JSP 中文乱码问题解决办法 JSP 页面中中文乱码问题是指在 JSP 页面中使用中文时,页面显示乱码的现象。这种问题的解决办法可以从多方面入手,包括设置页面的字符编码、使用 POST 方式提交表单、使用 GET 方式提交...

    解决linux下oracle中文乱码问题,添加中文支持

    解决linux下oracle中文乱码问题,添加中文支持解决linux下oracle中文乱码问题,添加中文支持解决linux下oracle中文乱码问题,添加中文支持解决linux下oracle中文乱码问题,添加中文支持解决linux下oracle中文乱码...

    解决PD4ML导出pdf中文乱码问题

    然而,当处理包含中文字符的文档时,可能会遇到乱码问题。这个问题通常源于编码设置不正确或者字体支持不足。 首先,我们要理解中文乱码的根源。在计算机系统中,文本是以特定编码方式存储的,如UTF-8或GBK。如果...

    extjs 前后台交互参数出现中文乱码问题的解决方法

    ### extjs前后台交互参数出现中文乱码问题的解决方法 #### 问题背景与原因分析 在使用MyEclipse开发工具进行Web应用开发时,尤其是采用ExtJS框架结合Ajax技术进行前后端数据交互的过程中,可能会遇到一个常见的...

    linux下中文乱码问题

    Linux 下中文乱码问题解决方法 Linux 操作系统中,中文乱码问题是一个常见的问题,它是由系统集成的字符集引起的。由于不能正确地使用相对应字符的字符集,因此 OS 不能识别出文字,导致了乱码。解决这个问题的方法...

Global site tag (gtag.js) - Google Analytics