- 浏览: 178158 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (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 732初探和实现websocket心跳重连 http://www ... -
Resin 维护
2018-06-13 09:42 599<!--[if gte mso 9]>< ... -
自动化测试
2016-12-13 17:16 6021、linux下 执行JMeter测试脚本 在机器的 ... -
Spark 记录
2016-07-15 09:47 6881、java.lang.StackOverflowError ... -
Java 日常操作
2016-03-15 09:57 589Eclipse 闪退 1、增加内存设置 -vmargs ... -
maven技术分享(一) 标准maven项目的搭建
2014-08-27 14:19 0其中的nexus 的maven 私服搭建,参考网上的资料。 ... -
Java 调用 C# DLL
2014-04-11 16:57 15662Java无法直接调用C# dll,需要通过经过桥接的方式, ... -
Apache 负载均衡的环境搭建 (使用Tomcat作为web server)
2012-03-02 17:21 2843前言 使用tomcat作为web server,搭建Apach ... -
知识归纳索引
2012-02-23 09:57 1128本片文章记录了读过的书籍和文章,并将原始资料作为附件上传。 ... -
acegi 开发笔记
2011-12-26 17:36 7996. 编译acegi-security-1.0.7-s ... -
Mule 开发问题记录
2011-11-30 16:54 17031. A Mule runtime distribution ... -
ActiveMQ问题解决记录
2011-11-09 14:24 12597问题4:Networks of Brokers 在每个acti ... -
Log4j 学习笔记
2011-09-14 12:00 916为了彻底掌握log4j的使用,有必要去了解log4j的实现结构 ... -
ESB 研究
2011-08-24 15:08 1267Introduction to ESB 一些ESB的名词 E ... -
struts 开发笔记
2011-08-24 10:44 13251,struts默认根据http request请求流中的键值 ... -
JMS,ActiveMQ 内部实现的研究
2011-08-23 10:28 10674问题1,AMQ 4的openWireFormat与AMQ 5的 ... -
Java 学习笔记:1,类引导,反射机制下的对象创建
2011-08-22 17:39 9151, 类引导,反射机制下的对象创建 类引导最终会字节流传给na ... -
设计模式
2011-08-04 11:38 10101, 设计模式在JDK中的体现 参见stackoverflow ... -
ActiveMQ 开发
2011-07-29 13:28 26541, 配置activemq.xml时,修改<broker ... -
Spring + Hibernate 例子(使用petclinic, 利用ant)
2011-03-03 16:30 1005Spring + Hibernate 例子 1. 使用Spr ...
相关推荐
Java关于中文乱码问题的多种解决方法,中文乱码过滤器
java中文乱码问题详解--- java中文乱码问题详
java中文乱码问题java中文乱码问题java中文乱码问题
java解决中文乱码问题
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
主要为大家分享了介绍了java中文乱码之解决URL中文乱码问题的方法,感兴趣的小伙伴们可以参考一下
JAVA常见中文乱码问题解决方法,JAVA常见中文乱码问题解决方法.
编码问题一直困扰着开发人员,尤其在Java中更加明显,因为Java是跨平台语言,不同平台之间编码之间的切换较多。本文将向你详细介绍Java中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别...
解决JAVA读取properties中文乱码问题
java中最头疼的可能就是中文乱码的问题,这个可以彻底解决中文乱码的问题
近正在做一个项目,其中遇到了一个问题是java与.NET之间的通信问题。具体的问题是这样的: 客户端使用java,服务器端使用的是C#。两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端...
阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有一个清晰明了的认识,于是LZ想通过这系列博文(估计只有几篇)来彻底分析、解决java中文乱码问题,如有错误之处望各位同仁指出...
Java生成pdf文件,解决中文乱码问题.pdf
java中文乱码解决问题
java 解析csv文件例子,csv文件 中文乱码问题
java中文乱码处理,本文中几个方法解决了中文乱码的问题 希望对你有帮助
Linux下Java程序中文乱码问题研究.pdf
JAVA反编译文件解决中文乱码问题