- 浏览: 182643 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (101)
- DataBase (8)
- Java (37)
- Software (14)
- JavaScript (8)
- XML (4)
- WebService (5)
- SharePoint (6)
- ESB (4)
- Algorithm&Data Structure (5)
- CloudFoundry (1)
- liferay (1)
- portal (1)
- System Analysis (1)
- Storm (2)
- linux (3)
- Server (1)
- elasticsearch (1)
- angular (1)
- spark (1)
- python (2)
- ELK (1)
- Resin (1)
- Flink (1)
- python AI (1)
最新评论
-
yuekinger:
若果 64bit 下正常 32位系统下不正常运行的 排除dll ...
Java 调用 C# DLL -
yuekinger:
Win764 系统下成功! 实现 java 调用 c++ 链接 ...
Java 调用 C# DLL -
sdasds:
sdasds 写道pp1314 写道x931100537 写道 ...
Java 调用 C# DLL -
sdasds:
pp1314 写道x931100537 写道Exception ...
Java 调用 C# DLL -
pp1314:
x931100537 写道Exception in threa ...
Java 调用 C# DLL
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进制反向解码,得到原始文本。
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输出流中字符编码处理
通过文件端口输出字符,为了保证能处理除英文之外的其他字符,满足兼容性的需要,生成输出流接口时,需指定字符编码集。
5. 文件IO输入流中字符编码处理
通过文件端口输输入字符,为了保证能处理除英文之外的其他字符,满足兼容性的需要,生成输出流接口时,需指定字符编码集。
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"/>
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"/>
- apache-tomcat-5.5.35-src.zip (5.8 MB)
- 下载次数: 3
发表评论
-
实时推送
2018-12-20 15:47 790初探和实现websocket心跳重连 http://www ... -
Resin 维护
2018-06-13 09:42 682<!--[if gte mso 9]>< ... -
自动化测试
2016-12-13 17:16 6481、linux下 执行JMeter测试脚本 在机器的 ... -
Spark 记录
2016-07-15 09:47 7571、java.lang.StackOverflowError ... -
Java 日常操作
2016-03-15 09:57 625Eclipse 闪退 1、增加内存设置 -vmargs ... -
maven技术分享(一) 标准maven项目的搭建
2014-08-27 14:19 0其中的nexus 的maven 私服搭建,参考网上的资料。 ... -
Java 调用 C# DLL
2014-04-11 16:57 15768Java无法直接调用C# dll,需要通过经过桥接的方式, ... -
Apache 负载均衡的环境搭建 (使用Tomcat作为web server)
2012-03-02 17:21 2903前言 使用tomcat作为web server,搭建Apach ... -
知识归纳索引
2012-02-23 09:57 1190本片文章记录了读过的书籍和文章,并将原始资料作为附件上传。 ... -
acegi 开发笔记
2011-12-26 17:36 8376. 编译acegi-security-1.0.7-s ... -
Mule 开发问题记录
2011-11-30 16:54 17461. A Mule runtime distribution ... -
ActiveMQ问题解决记录
2011-11-09 14:24 12668问题4:Networks of Brokers 在每个acti ... -
Log4j 学习笔记
2011-09-14 12:00 968为了彻底掌握log4j的使用,有必要去了解log4j的实现结构 ... -
ESB 研究
2011-08-24 15:08 1310Introduction to ESB 一些ESB的名词 E ... -
struts 开发笔记
2011-08-24 10:44 13721,struts默认根据http request请求流中的键值 ... -
JMS,ActiveMQ 内部实现的研究
2011-08-23 10:28 10731问题1,AMQ 4的openWireFormat与AMQ 5的 ... -
Java 学习笔记:1,类引导,反射机制下的对象创建
2011-08-22 17:39 9851, 类引导,反射机制下的对象创建 类引导最终会字节流传给na ... -
设计模式
2011-08-04 11:38 10441, 设计模式在JDK中的体现 参见stackoverflow ... -
ActiveMQ 开发
2011-07-29 13:28 26861, 配置activemq.xml时,修改<broker ... -
Spring + Hibernate 例子(使用petclinic, 利用ant)
2011-03-03 16:30 1062Spring + Hibernate 例子 1. 使用Spr ...
相关推荐
在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...
### Java中文乱码问题详解 #### 一、中文问题的来源与背景 计算机技术发展初期,操作系统主要支持单字节的ASCII字符集。随着全球化进程加快和技术进步,为支持多种语言,尤其是双字节编码的语言(如中文),提出了...
### Java中汉字编码问题详解 在Java开发过程中,汉字编码问题常常给开发者带来困扰,特别是在涉及国际化或多语言环境的应用开发中。本文将详细介绍在Java环境中遇到的汉字编码问题及其解决方案,帮助开发者更好地...
总之,解决Java中的URL中文乱码问题需要理解URL编码的原理,并在客户端和服务器端采取相应的措施,确保编码和解码的一致性。无论是通过JavaScript编码、Java服务器端解码,还是调整服务器配置,关键在于确保字符集的...
Java 解决中文乱码问题 Java 中文乱码问题是中国程序员无法避免的话题。乱码的出现是由于中文和英文的编码格式不同,解码也是不一样...解决 Java 中文乱码问题的关键是选择合适的编码方式和正确地配置 Tomcat 和 JSP。
JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在...
总之,解决Java中的中文乱码问题,关键在于识别出问题所在的具体环节,然后根据该环节的特点选择合适的编码设置。理解字符编码的工作原理,以及如何在Java中操作字符编码,对于避免和解决乱码问题至关重要。在实际...
解决Java中文乱码问题的核心在于:确保每个环节的编码一致,从源代码到最终显示的所有过程都应采用相同的字符编码标准。在实践中,推荐使用UTF-8编码,因为它具有广泛的支持和兼容性。 在实际项目中,当遇到乱码...
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
Java编程语言在处理中文字符时可能会遇到乱码问题,这主要源于Java的源代码编码、JVM处理class文件以及不同操作系统、数据库系统之间的编码不一致。本文深入剖析了Java中文问题的根源,并提供了相应的解决方案。 一...
Java中默认使用的是Unicode编码,但在处理外部数据时,如读取文本文件、接收HTTP请求或连接数据库时,如果没有正确设置编码,就可能导致乱码问题。例如,当读取GBK编码的文本文件,而使用UTF-8解码时,会出现乱码。 ...
在IT行业中,尤其是在Java编程领域,中文乱码问题是一个常见的挑战。这主要涉及到字符编码的处理,涉及到Unicode、GBK、UTF-8等不同编码格式之间的转换和一致性问题。本篇文章将深入探讨这个问题,并提供一种彻底...
2. 使用GBK编码方式:对于一些特殊的汉字,使用GBK编码方式可以解决中文乱码问题。 3. 使用字符集转换:可以使用字符集转换工具将GBK编码方式转换为UTF-8编码方式。 4. 使用Java语言的中文支持类库:Java语言提供了...
总结一下,Java中文乱码问题的解决主要依赖于以下几个关键点:正确设置源代码的编码、指定JVM的字符编码、理解并正确处理文件和网络通信的字符编码。通过细心的检查和配置,大部分乱码问题都能得到解决。同时,了解...
"Java中文乱码问题解决" ...解决Java中文乱码问题需要了解编码的基本原理和各种编码格式的区别,并了解Java中常见的编码格式和应用场景。只有这样,才能更好地避免乱码问题,提高Java开发的效率和质量。
在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...
Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何使用 iText 库生成 PDF 文件,解决中文乱码...
总结来说,处理Java中ZIP文件的中文乱码问题,关键在于明确指定字符集,通常是UTF-8,无论是使用Java内置的API还是第三方库。同时,理解文件系统的编码和压缩/解压过程中的字符编码转换也非常重要。通过这种方式,...
总结来说,解决Linux下Java中文乱码问题,关键在于确保编码一致性,包括JVM、源代码、文件读写、网络数据以及图形界面的字体设置。同时,使用统一且支持中文的编码,如UTF-8,可以有效避免乱码现象。