`

java程序编码乱码相关

阅读更多
1.linux系统查看编码命令:locale,
更改编码:
export ALL="zh_CN.UTF-8"
export LANG="zh_CN.UTF-8"

2.转自:http://kalogen.iteye.com/blog/875230
最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,先说下我的环境,servlet容器使用Tomcat6.0,浏览器FireFox3.0、IE6,涉及字符编码设置的地方我的思路就是编码的地方都统一使用UTF-8,具体配置如下:
1.所有页面的charset设置为UTF-8。
2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
其实这样的设置貌似是不会再出现乱码问题了,不过,问题依旧来了,如果我在浏览器的地址栏中输入中文参数提交,返回的页面却出现了乱码。真搞不明白到底是哪里出了问题!说起来对中文乱码的问题一直是一支半解,出现乱码了,网上搜罗了一大堆资料,按照网上的配置,问题到是解决了,不过原理却搞的很模糊,一个请求发送到服务器,服务器业务逻辑处理后返回一个页面,这中间涉及的字符集转换,编码,解码过程一概不清楚。这次,折腾了半天,总算是更进一步了解了字符编码问题,这里做个总结。
先看我的总结,有不对的地方欢迎批评。
首先我们看下,一个请求响应的流程

浏览器 IE/FireFox ----------->Servlet容器------------------------>显示页面
       编码                           使用容器的URIEncoding转码              解码
我把用户发送请求方式不同引起的中文问题划分了四种类型:
1、表单的get提交
2、表单的post提交
3、页面链接传递中文参数
4、地址栏中参数直接输入中文提交

1.首先我们看表单get方式提交
     浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器,首先进入对应的字符编码过滤器(如果有的话),不过Tomcat6.0对于get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文字符串。那么,响应页面的中文因为页面的统一编码(UTF-8)自然也会正常显示。当然,如果我们Tomcat的URIEncoding设置为其他非UTF-8的编码方式时,页面的内容进入Tomcat解析时,因为Tomcat和页面的编码不统一,就需要转码。例如,如果我们采用Tomcat默认的ISO-8859-1,那么当我们使用request.getParameter("yourVariable")获取表单参数值时其实Servlet就进行了转码,它会以容器编码方式进行解码,这个过程如下:
UTF-8(编码)-->ISO-58859-1(解码)
这个过程也相当于我们使用如下的语句
Java代码


1.new String(变量值.getBytes("UTF-8"),"ISO-8859-1"); 

new String(变量值.getBytes("UTF-8"),"ISO-8859-1");根据API的解释,先将变量值以UTF-8字符集编码转换为字节序列,再以ISO-8859-1字符集解码字节数组,构造出新的字符串对象。
等价于以下方式:
Java代码


1.String code = "编码";  
2.code = URLEncoder.encode(code,"UTF-8");  
3.code = URLDecoder.decode(code,"ISO-8858-1"); 

String code = "编码";code = URLEncoder.encode(code,"UTF-8");code = URLDecoder.decode(code,"ISO-8858-1"); 例如表单的username属性以字符串"编辑"提交,那么进入容器后,FormBean中的这个变量会乱码,request.getParameter(username)一样的效果,s1就是request返回的结果,下面是内存快照。

不过即使这样,我们依然可以使用不恰当的方法显示正常的中文,即逆向转码,例如上面的乱码,我们可以通过ISO8859-1-->UTF-8这种方式还原我们提交时的中文。以下是GBK,UTF-8,ISO-8859-1三者之间互相转换的内存快照:

我们可以看到,偶数汉字可以在UTF-8,GBK两者中互相转换,而奇数个汉字则不能。综上看来,貌似Tomcat的URIEncoding设置为UTF-8是最好的解决办法,不过这样的设置依然无法解决上面我所说的第三、第四种情况。大家继续向下看。(这里有一点我不确定,就是页面提交至Servlet容器时,是以页面的charset方式编码后直接进入容器,还是以charset转码为ISO-8859-1方式进入,大家有什么见解?)
2.表单的post提交
对于这种方式的请求,request.setCharacterEncoding("一般来自于web.xml中过滤器设置的参数")方法进行编码设置将会产生作用,struts的表单提交方式默认为post方式,那么按照上面我的环境设置,页面,容器,都采用UTF-8编码方式,就不会产生中文乱码问题。
3.页面链接中传递中文参数
我虚拟一个这样的场景,请求页面中有如下代码
Html代码


1.<%  
2.String username = "编辑";  
3.%>

4.<a
href="hello.do?username=<%=username%>">页面中链接传递中文</a>


<%String username = "编辑";%><a href="hello.do?username=<%=username%>">页面中链接传递中文</a>对于这种方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,如下
Java代码


1.<%  
2.String username = java.net.URLEncoder.encode("编辑","UTF-8");  
3.%> 

<%String username = java.net.URLEncoder.encode("编辑","UTF-8");%>那么这样我们也不会产生中文乱码问题
4.地址栏中参数直接输入中文提交
例如浏览器地址栏中输入"http://localhost:8080/helloapp.do?username=编辑"提交,对于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至Servlet容器,那么,如果对于前三种方式我们所做的设置,在这里就有问题了,因为进入容器时中文进行了GBK至ISO-8859-1的转码,而之前我们的Servlet容器URIEncoding设置为UTF-8,当我们使用request.getParameter("username")时,相当于又进行了这样的流程GBK-->ISO-8859-1-->UTF-8,按照以上我们使用的测试中文,“编辑”,使用request.getParameter("username")则会得到这样的结果�༭,下图是进行转码的内存快照:


我们可以看到
“编辑”经过从GBK-->ISO-8859-1-->UTF-8的过程后得到的就是�༭这样的结果,这里我们还会想到那进行2次逆向转码看看,不过可惜的是,结果为“锟洁辑”。对于这种情况,我们的解决办法就是,Tomcat的URIEncoding采用默认的ISO-8859-1字符集,那么我们可以在程序中通过ISO-8859-1-->GBK这样不恰当的逆向转码方式得到正常的中文“编辑”,但这样的结果是,我们get请求方式的中文处理解决办法就需要改变。如,在我的环境下就需要进行ISO-8859-1-->UTF-8的转码,挺不爽。

综上,对于乱码问题,前三种方式是一般用户的请求方式,第四种属于非正常途径的请求方式,对于这种方式产生的问题我认为无法很好的解决,也不需要解决。我看到javaeye对于这样的情况就没有处理,不知道大家在自己的项目中是如何处理的?我的实验是,IE6的设置会影响应用路径的编码方式,例如地址栏中请求一个中文JSP页面,如:http://localhost:8080/helloapp/编辑.jsp,IE默认是勾选"以UTF-8发送URL"项的,那么按照我上面总结的处理方式,这个请求可以正常显示页面,如图:

如果取消IE的这个选项,那么浏览器会以GBK编码应用路径的中文,得到的结果如图:

按照我上面的设置,这里如果将Tomcat的URIEncoding设置为GBK,则也可以正常显示页面。对于FireFox3.0,则是以UTF-8编码。
最后,回到我的题目,向大家讨教下,IE6的“以UTF-8发送URL”选项设置对请求页面字符编码有影响吗?欢迎讨论!

我的测试代码共享给大家:),使用的是struts1.2,struts的jar包,大家可以去apache下载。

这里推荐个链接,有兴趣的可以深入了解更多字符集、编码的问题。
http://hideto.iteye.com/blog/97803
分享到:
评论

相关推荐

    Linux下Java程序中文乱码问题研究.pdf

    "Linux下Java程序中文乱码问题研究" 本文主要研究了在Linux操作系统下Java程序中文乱码的问题。该问题是指在Java程序中使用中文时,出现乱码的情况。这是一个常见的问题,在开发Java程序时经常会遇到。 字符集 ...

    java字符集编码乱码详解

    ### Java字符集编码乱码详解 #### 一、编码与乱码基础知识 在计算机科学领域,字符集(Character Set)是指一系列符号和电子通信代码的标准集合。每种字符集都有其特定的应用场景和优势。例如,ASCII(American ...

    Java关于中文乱码问题的多种解决方法

    当Java程序读取或写入包含中文字符的文件时,需要设置正确的字符编码。例如,使用`FileReader`和`FileWriter`时,可以通过构造函数传入`Charset`对象,如`new FileReader(file, "UTF-8")`。如果使用`BufferedReader...

    java中文乱码解决问题

    对于大多数数据库的 JDBC 驱动程序,在 Java 程序和数据库之间传递数据都是以 ISO-8859-1 为默认编码格式,所以,我们在程序中向数据库存储包含中文的数据时,JDBC 驱动程序首先把程序内部的 Unicode 编码格式的数据...

    java中文乱码大全

    4. 跨平台运行问题:Java程序从一种操作系统移植到另一种操作系统时,由于编码格式的不一致性,可能会产生中文乱码问题。 针对上述问题,可以采取以下方法来解决Java中文乱码问题: 1. 统一编码格式:在Java程序中...

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

    4. **输入输出流的编码设置**:Java程序在进行文件读写或网络通信时,需要显式地指定字符集编码,以避免乱码问题的发生。 5. **浏览器与服务器间的编码一致性**:对于Web应用程序而言,客户端与服务器之间必须保持...

    JAVA常见中文乱码问题解决方法

    然而,许多操作系统,如中文Windows,默认使用GBK或GB2312编码,这就导致了Java程序在读写中文时可能出现乱码。 1. Java源文件的编码:Java源代码文件可能以不同的编码(如GBK、GB2312)保存,而Java编译器默认使用...

    java插入数据乱码解决集锦

    2. **调整Java程序编码设置** - 在Java程序中,确保设置了正确的请求和响应编码: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...

    Java中文乱码浅析及解决方案

    Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码的不一致,即不同环节采用的字符编码标准不统一。本文将深入探讨这一问题,并提供相应的解决方案。 首先,...

    java获取乱码问题

    - 可以通过查看浏览器发送请求时的编码设置,或者在Java程序中通过`request.getCharacterEncoding()`方法获取客户端设置的字符编码。 - **如何解决POST方式提交的乱码问题?** - 对于POST方式提交的数据,可以在...

    彻底解决中文乱码的问题

    这些问题的根源在于编码的不统一,比如文件是GBK编码,但程序按照UTF-8来解析,就会出现乱码。 解决中文乱码问题的关键在于确保编码的一致性。以下是几种常见的解决策略: 1. 文件读写:在使用`BufferedReader`或`...

    java插入mysql中文乱码解决

    - **Java程序编码**:确保Java程序内部使用的编码为UTF-8,可以在项目启动时通过 `-Dfile.encoding=UTF-8` 参数来设置。 - **MySQL服务器编码**:登录MySQL后执行 `SHOW VARIABLES LIKE 'character%';` 查看当前...

    JAVA程序的编码格式详解

    ### JAVA程序的编码格式详解 #### 一、引言 编码问题一直是开发人员尤其是Java开发者面临的常见挑战之一。由于Java是一种跨平台的语言,因此在不同的操作系统之间存在编码格式的差异,这导致了在处理文本数据时经常...

    java编程中乱码问题解决

    在Java程序中,可以通过设置系统属性或使用`setEncoding`方法来指定正确的字符集编码。 ```java System.setProperty("file.encoding", "UTF-8"); ``` 对于Web应用而言,还需要确保HTML页面和JSP页面中都正确设置了...

    JAVA 解决Properties文件保存中文乱码

    总结,解决Java中Properties文件中文乱码问题的关键在于正确指定文件的编码。无论是保存还是读取,都需要确保与文件实际的编码一致。在处理这类问题时,了解和掌握不同的API以及它们的用法是至关重要的,这样才能...

    java读写csv文件,中文乱码问题

    如果CSV文件是以UTF-8编码的,但Java程序在读取时假设它是GBK或其他编码,就会导致乱码。反之亦然。 解决Java读取CSV文件中文乱码问题的步骤如下: 1. **指定字符编码**:在使用`BufferedReader`或者`FileReader`...

    javadbf中文乱码

    当这些文件被Java程序读取时,如果没有正确设置字符编码,就会出现乱码。 `javadbf`库通过提供API来处理DBF文件的读写,其中包括了对编码的支持。要解决中文乱码问题,你需要确保在使用`javadbf`打开DBF文件时,...

    java 编码,乱码,字符系列(1)

    3. 输入/输出流编码:当Java程序读取或写入文件、网络数据时,需要指定字符编码。例如,`InputStreamReader`和`OutputStreamWriter`类可以用来指定输入流和输出流的字符编码。 4. 系统默认编码:Java系统属性`file....

    java编码格式(对常见的java中文乱码作出分析及提出解决方案)

    当Java程序在这些不同环境下运行时,如果不正确地处理编码转换,就会出现乱码。 Java源文件(.java)通常由开发人员在特定的编码环境下创建,例如在中文Windows中使用GBK编码的记事本。当使用JDK的javac编译器时,...

    java 中文乱码 处理

    以上介绍了几种常见的Java中文乱码处理方法,包括请求参数编码转换、字符串转义与反转义、前端JavaScript处理以及配置J2EE应用程序。每种方法都有其适用场景,开发者可以根据实际情况选择合适的方法来解决乱码问题。...

Global site tag (gtag.js) - Google Analytics