`
7wolfs
  • 浏览: 182643 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java 中的 中文编码

    博客分类:
  • Java
阅读更多
1. java.net.URLEncoder.encode
java.net.URLEncoder.encode是将文本内容进行编码转换,然后将每个字节用16进制表示,每个字节内容转成由%和16进制符号格式组成的内容,为了方便网络传输。
String.getBytes是将文本内容根据指定的字符集直接进行编码转换,不会再进行16进制转换。
客户端发送文本内容到服务器端时,先将内容用URLEncoder以UTF-8进行encode,转成16进制格式,再发送转码过的内容,该内容会被Web Server中默认的字符集(ISO-8859-1)进行编码,Server接收后,为了获取客户端发送的原始文本,需要反向解码。先按ISO-8859-1获取用URLEncoder进行encode过的内容,再按照UTF-8进行URLDecoder.decode,进行16进制反向解码,得到原始文本。

String cnStr = "中文";
		String cnStr1 = "";
		

		cnStr1 = new String(java.net.URLEncoder.encode(cnStr, "UTF-8").getBytes(), "ISO-8859-1");

		System.out.println(java.net.URLDecoder.decode(new String(cnStr1.getBytes("ISO-8859-1"), "UTF-8"), "UTF-8"));
		


2. 通过HttpServletResponse直接输出字符时,为了特殊字符需要指定编码集
通过HttpServletResponse.setCharacterEncoding("utf-8") 方法设置输出流的字符编码,该动作需要在HttpServletResponse.getWriter();之前调用,否则会造成输出流按照默认的编码集进行编码。HttpServletResponse.getWriter()一旦被调用后,输出流的字符编码集即确定下来,无法修改。
参见tomcat 5或6中的javax.servlet.http.HttpServletResponse源代码。

3. String 类中字符串编码处理
String由char数组组成,每个char以unicode编码集中的标准形式存在。
将String转成byte数组时,首先将unicode编码的char按照指定的编码集格式转成byte。
将byte数组转成String时,首先将指定编码集格式的byte序列组装成char数组,生成的char数组构成String。

4. 文件IO输出流中字符编码处理
通过文件端口输出字符,为了保证能处理除英文之外的其他字符,满足兼容性的需要,生成输出流接口时,需指定字符编码集。
OutputStreamWriter osw = new OutputStreamWriter(new  FileOutputStream("test.txt"), "utf-8");  
osw.write("中文");   
osw.close();  


5. 文件IO输入流中字符编码处理
通过文件端口输输入字符,为了保证能处理除英文之外的其他字符,满足兼容性的需要,生成输出流接口时,需指定字符编码集。
StringBuffer buffer = new StringBuffer();
FileInputStream fis = new FileInputStream(targetFile);
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
    buffer.append((char)ch);
}
in.close();
return buffer.toString();


6. 页面前端编码与服务端解码的字节内容的交互
场景:
页面调用两次js 的encodeURI方法进行字符编码用post方式提交,服务器端(tomcat、struts、spring)使用java.net.URLDecoder.decode(getRequest().getParameter("jsonStr"),"UTF-8")对他进行解码。
流程:
以中文字符的‘中’字为例:‘中’字的UTF-8的编码是:E4B8AD。‘中’字经过js的encodeURI第一次转码后变成以%前缀表示的16进制UTF8编码串(%E4%B8%AD),再次调用js的encodeURI进行第二次编码(encodeURI(encodeURI("中"))),会得到新的编码串%25E4%25B8%25AD,这个编码串里每个字符都作为最小单位的字节以字节流形式通过post方式传递到服务器。

服务器tomcat接受到内容后,服务器内部程序调用org.apache.catalina.connector.Request.getParameter(String name)方法触发对URL中的传入参数的编码集解析(如果parameter尚未解析过,调用parseParameters方法进行解析,该方法会对url后的queryString和post提交的request body内容都进行解析),对字符串内容的具体解析在org.apache.tomcat.util.http.Parameters.processParameters(byte[] bytes, int start, int len, Charset charset)方法中完成。

处理规则参见org.apache.tomcat.util.buf.UDecoder.convert(ByteChunk mb, boolean query)。该方法首先处理有%前缀的字节:遇到%,则会将%后面的两个字节进行16进制转换转成数字并相加,得到一个十进制数字
,该值与ascii字符表中的值相对应,其他不是以%为前缀的普通字符字节则被原封不动的放入结果字节流中。

%25E4%25B8%25AD编码串中的%25经过这一步骤就会转成%字节,最终结果是%E4%B8%AD。处理完%前缀的字节后,将结果字节串%E4%B8%AD传入 new String(data, 0, ox, encoding)中,即使方法中的encoding是UTF-8,字节串%E4%B8%AD也不能被String对象的UTF8编码表所识别。因为他不是UTF8原始字节串,他是‘中’字符在UTF8中以16进制标识、%字符为前缀的一种组合表达方式,要转成能被UTF8编码表能识别的字节流,需要将以%为标识的每组3个字节经过运算转成一个字节,最终转成3个字节,这是‘中’字符在UTF8编码表中实际的字节数,他可以被UTF8编码表解析成对应的可识别的特殊字符‘中’。该运算通过java.net.URLDecoder.decode来完成,他会识别%标识的3个字节为一组的字节流,他一旦发现%后的字节不是合法的16进制范围内的值时,则提示解码错误。

JavaScript的encodeURI方法说明如下:
The encodeURI function returns an encoded URI by replacing all special characters with their corresponding UTF-8 escape sequences.
encodeURI() does not encode the following characters: ~ ! @ # $ & * ( ) = + ; : ' , / ?


7.tomcat服务器下,get方式提交中文时有乱码问题。
首先是get方式提交乱码,修改tomcat的server.xml。在Connector节点添加URIEncoding="UTF-8"
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --><Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
3
1
分享到:
评论

相关推荐

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

    在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...

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

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

    java中汉字编码问题

    ### Java中汉字编码问题详解 在Java开发过程中,汉字编码问题常常给开发者带来困扰,特别是在涉及国际化或多语言环境的应用开发中。本文将详细介绍在Java环境中遇到的汉字编码问题及其解决方案,帮助开发者更好地...

    java中文乱码之解决URL中文乱码问题的方法

    总之,解决Java中的URL中文乱码问题需要理解URL编码的原理,并在客户端和服务器端采取相应的措施,确保编码和解码的一致性。无论是通过JavaScript编码、Java服务器端解码,还是调整服务器配置,关键在于确保字符集的...

    java解决中文乱码问题

    Java 解决中文乱码问题 Java 中文乱码问题是中国程序员无法避免的话题。乱码的出现是由于中文和英文的编码格式不同,解码也是不一样...解决 Java 中文乱码问题的关键是选择合适的编码方式和正确地配置 Tomcat 和 JSP。

    java中文乱码解决问题

    JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在...

    Java开发中文乱码问题解决

    总之,解决Java中的中文乱码问题,关键在于识别出问题所在的具体环节,然后根据该环节的特点选择合适的编码设置。理解字符编码的工作原理,以及如何在Java中操作字符编码,对于避免和解决乱码问题至关重要。在实际...

    java中文乱码问题

    解决Java中文乱码问题的核心在于:确保每个环节的编码一致,从源代码到最终显示的所有过程都应采用相同的字符编码标准。在实践中,推荐使用UTF-8编码,因为它具有广泛的支持和兼容性。 在实际项目中,当遇到乱码...

    java zip解压中文乱码问题

    网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...

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

    Java编程语言在处理中文字符时可能会遇到乱码问题,这主要源于Java的源代码编码、JVM处理class文件以及不同操作系统、数据库系统之间的编码不一致。本文深入剖析了Java中文问题的根源,并提供了相应的解决方案。 一...

    深入分析 Java 中的中文编码问题

    Java中默认使用的是Unicode编码,但在处理外部数据时,如读取文本文件、接收HTTP请求或连接数据库时,如果没有正确设置编码,就可能导致乱码问题。例如,当读取GBK编码的文本文件,而使用UTF-8解码时,会出现乱码。 ...

    彻底解决中文乱码的问题

    在IT行业中,尤其是在Java编程领域,中文乱码问题是一个常见的挑战。这主要涉及到字符编码的处理,涉及到Unicode、GBK、UTF-8等不同编码格式之间的转换和一致性问题。本篇文章将深入探讨这个问题,并提供一种彻底...

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

    2. 使用GBK编码方式:对于一些特殊的汉字,使用GBK编码方式可以解决中文乱码问题。 3. 使用字符集转换:可以使用字符集转换工具将GBK编码方式转换为UTF-8编码方式。 4. 使用Java语言的中文支持类库:Java语言提供了...

    Java 中文乱码问题

    总结一下,Java中文乱码问题的解决主要依赖于以下几个关键点:正确设置源代码的编码、指定JVM的字符编码、理解并正确处理文件和网络通信的字符编码。通过细心的检查和配置,大部分乱码问题都能得到解决。同时,了解...

    java中文乱码问题解决

    "Java中文乱码问题解决" ...解决Java中文乱码问题需要了解编码的基本原理和各种编码格式的区别,并了解Java中常见的编码格式和应用场景。只有这样,才能更好地避免乱码问题,提高Java开发的效率和质量。

    java Socket与C#通信中中文乱码问题的解决方案

    在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...

    Java生成pdf文件,解决中文乱码问题.pdf

    Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何使用 iText 库生成 PDF 文件,解决中文乱码...

    java压缩zip文件解决中文乱码问题

    总结来说,处理Java中ZIP文件的中文乱码问题,关键在于明确指定字符集,通常是UTF-8,无论是使用Java内置的API还是第三方库。同时,理解文件系统的编码和压缩/解压过程中的字符编码转换也非常重要。通过这种方式,...

    解决Linux操作系统下Java的中文乱码问题

    总结来说,解决Linux下Java中文乱码问题,关键在于确保编码一致性,包括JVM、源代码、文件读写、网络数据以及图形界面的字体设置。同时,使用统一且支持中文的编码,如UTF-8,可以有效避免乱码现象。

Global site tag (gtag.js) - Google Analytics