- 浏览: 1683983 次
- 性别:
-
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
通过前面中文化、国际化问题解决的系列1-4,相信大家对字符集、字符编码、字符解码、字符乱码、Java中文问题解决等都有了一个比较清晰的认 识;但文中的信息并非包罗万象,结合到自己平时对于字符集、编码相关的一些疑惑,本篇对一些前文中并未提及的一些问题进行补充,以便让该系列更加完善和全 面;本文主要解决以下两个问题:其一,解决UltraEdit菜单中的 文件 -> 转换 子菜单中涉及的一些名词疑惑,主要涉及EBCDIC 、OEM字符集、ANSI字符集、HZ编码等;其二,补充关于URL编码相关的一些知识点,涉及浏览器、Web服务器设置、Servlet规范等;
更多的与字符集相关的专业词汇简介
相信很多同学都有在用UltraEdit这个文本编辑器软件,从菜单 文件--> 转换 进入即可看见很多的字符集间的转换子菜单,不同版本间可能会有些差异,可以参考下图:
从上图中我们可以看到很多前面已经提及的一些词汇,比如ASCII、Unicode [Big Endian/Little Endian]、UTF-8等;但还有一些未提及的,下面就逐个介绍下:
- l DOS/UNIX/MAC
间的转换
:
这几项和字符集无关,主要是由于各个系统对行结束字符的要求不一样,体现在:Mac格式只要求回车、Unix只要求换行、DOS则要求回车、换行 二者组合;这几个命令要做的就是对这几个特殊字符进行相应替换; - l EBCDIC
(Extended Binary Coded Decimal Interchange Code):
他 是与ASCII同时期的一种字符编码,主要用于IBM计算机中;它采用8位码, 有256个编码状态, 但只选用其中一部分。0-9十个数字符的高4位编码为1111, 低4位仍为0000-1001。大、小写英文字母的编码同样满足正常的排序要求, 而且有简单的对应关系, 即同一个字母的大小写的编码值仅最高的第二位的值不同, 易于识别与变换。 - l OEM
字符集
:
由于ASCII码只利用了低7位,第8位没有 被使用,而随着计算机的发展,很多原始设备制造商(当时最有名的应该就是IBM了)觉得ASCII码已经无法满足需求了,所以他们各自对第8位进行了自定 义扩展,从而形成了五花八门的OEM字符集;由于这些扩展都是不通用的,只有各自能够解释,这些不兼容的扩展又叫做代码页(Code Page),在同一台机器中,通过不同的代码页就可以实现系统间信息的转换了; - l ANSI
字符集
:
正如前面提到的,众多的OEM厂商对第8位 进行了自定义扩展;但更加夸张和恐怖的事情是,随着计算机进入亚洲,此时却发现整整用完8位也无法将所有的他们需要的语言字符;于是在ASCII的基础上 他们再次进行了扩展,从而产生了双字节字符集DBCS(double byte character set),我们常见的国标系列GB2312/GBK/BIG5......都属于此类;这些字符集有一个共同的特点:完全兼容 ASCII !这是ANSI系列和Unicode系列最大的不同点;这类型基于ASCII码进行扩展的多字节字符集MBCS统称为ANSI字符集;注意:ANSI字符集之间也是无法直接识别的,需要进行自定义转换; - l 提到国标系列,在此我还想提一个编码:HZ
码
,HZ是汉字的简称?
他 是基于GB字符集的一种简体中文编码,在新加坡被广泛使用;编码规则为:他将每个字节中的第8位(在GB字符集中该位为1)屏蔽,只保留低7位,并将经过 变换后的部分用~{、~}括起来;解码的时候只需要将括号对里面的部分高位还原成1即可;这样就可以在互联网上广泛的传输了,而不必受制于某些系统只能接 收基于ASCII码的字符;
URL编码
基于Java开发的Web应用URL组成如下:
http://domain:port/contextPath/servletPath/pathInfo?queryString
其中各个部分含义如下:
Domain、Port:分别是域名和端口;
contextPath:应用上下文路径,默认为应用名称,比如我们的apps;但可以通过应用服务器的相关配置进行修改,一般线上环境会修改成/,此时相当于contextPath为空;
servletPath:Servlet
路径,一般在应用的web.xml文件中配置servlet-mapping;但由于现在的web应用一般都会用一些框架,比如Struts、
Webwork等,此时各框架都会对此进行封装,会在另外的配置文件中进行设置;但原理都是一样的;
pathInfo:可以理解为最终接收用户请求的具体执行类,比如我们常说的Action;
queryString:get方式传入的请求参数;
以上各个部分中可能存在中文问题的是
pathInfo
、queryString
两个部分;
首先,我们来看下Servlet中和URL相关的一些api及其注意事项:
HttpServletRequest.setCharacterEncoding();
//仅仅只适用于设置post提交的request
body的编码而不是设置get方法提交的queryString的编码。该方法还告诉应用服务器应该采用什么编码解析post传过来的内容;注意:若没
有设定characterEncoding,则使用ISO-8859-1来解码用户输入的表单,而不是使用系统默认的编码
。
HttpServletResponse.setContentType(); //告诉浏览器网页中数据是什么编码;表单提交时,根据ContentType指定的charset对表单中的数据编码,然后发送给服务器。
HttpServletRequest.getParameter("name");
//返回的字符串为:queryString(包括get和post),其值经过Servlet服务器URL
Decode过的,默认编码来源于应用服务器中的配置,比如tomcat中server.xml的URIEncoding。
HttpServletRequest.getPathInfo(); //返回的字符串为:pathinfo;由Servlet服务器解码(decode)过的。默认编码同上,tomcat中可设置useBodyEncodingForURI。
HttpServletRequest.getRequestURI(); //返回的字符串为:contextPath/servletPath/pathinfo;注意是浏览器提交过来的原始数据,未被Servlet服务器URL Decode过。
对URL编码【URL Encoding/Percent Encoding
】时,使用以下规则:
字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
特殊字符 "."、"-"、"*" 和 "_" 保持不变。
空格字符 " " 转换为一个加号 "+"。
所
有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中
xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。
假定我们待请求URL为:http://localhost:8080/example/
中国?name=中国;
Html内content-type或meta中的charset=GBK
;文件格式为ANSI/ASCII;
URL中的两个汉字"中国"的各字符集下的编码为:
汉字 | 编码 | 二进制表示 |
中国 | UTF-8 | 0xe4 0xb8 0xad 0xe5 0x9b 0xbd[-28, -72, -83, -27, -101, -67] |
中国 | GBK | 0xd6 0xd0 0xb9 0xfa[-42, -48, -71, -6] |
中国 | ISO8859-1 | 0x3f 0x3f[63, 63][??] |
对于Get方式的URL请求有两种情况,其一:用户直接在浏览器地址栏中输入URL,此时浏览器没有编码可参考,直接用浏览器的默认编码进行解析并 提交到服务端;其二:在form表单内提交,只是form属性method为GET,此时浏览器会参考目前html中对编码的相关设置进行解析,比如 content-type或meta中的charset。
以下就重点讲讲第二种方式的提交:
GET方式form submit:浏览器会对URL进行URL encoding,然后发送给服务器。
- 对于中文IE,如果在高级选项中选中总以
UTF-8
发送
(默认方式),则PathInfo在URL Encoding时按照UTF-8编码;QueryString按照GBK编码。
此时提交是:GET /example/%E4%B8%AD%E5%9B%BD?name=%D6%D0%B9%FA - 对于中文IE,如果在高级选项中取消总以
UTF-8
发送
,则PathInfo和QueryString在URL encoding时按照GBK编码。
此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA - 对于中文firefox、Chrome,因为没有类似IE中的这种设置选项,所以这两种浏览器中对pathInfo的编码规则没有做特殊处
理,MS是和queryString采取同样的编码规则;在本例中的假设情况下:pathInfo和queryString在URL
encoding时都按照GBK编码。
此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码,该编码可能不会由我们应用来控制;对于 queryString,则是可以由我们的应用来完全控制的,对于上面的事例:中文的IE和FIREFOX都是采用GBK编码queryString。
若调整下上例中的假设条件,设置Html内content-type或meta中的charset=UTF-8
;
此时在IE中queryString会按照UTF-8进行编码,即name=%E4%B8%AD%E5%9B%BD;
但是在非IE(Firefox、Chrome)中,此时提交时URL中会以中文直接提交,即name=中文;此时服务端的web服务器上肯定要进行相应的编码配置,否则肯定会出现乱码;
若设置Html内content-type或meta中的charset=ISO-5899-1
;
此时在IE、Firefox、Chrome中queryString都被用ISO-5899-1编码了,即name= %26%2320013%3B%26%2322269%3B;
对于编码串中的%26、%3B应该是百分号编码【Percent Encoding
】中的保留字符,分别对应&、;,两者之间是经过编码的十进制码;对于这点偶也不是十分肯定?要是有同学比较清楚,请告诉偶下,thx。
POST方式提交:表单中的参数值对是通过request body发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。
在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据。
小结:
- 1. URL中的PathInfo字符串的编码和解码是由浏览器和应用服务器的配置决定的,我们的程序不能设置,不要期望用 request.setCharacterEncoding()方法能设置URL中pathInfo解码时的字符集,这在servlet规范里面有说明。
- 2. URL中如果含有中文等非ASCII字符,则浏览器会对它们进行URLEncode。为了避免浏览器采用了我们不希望的编码,所以最好不要在URL中直接使用非ASCII字符,而采用URL Encode编码过的字符串%xy;
对此建议URL:http://localhost:8080/example/%D6%D0%B9%FA?name=%D6%D0%B9%FA - 3. URL中PathInfo和QueryString应该采用相同的编码,pathInfo最好不要用中文;因为不同浏览器对URL中PathInfo和QueryString编码时采用的字符集不同,但应用服务器对URL通常会采用相同的字符集来解码。
- 4. URL中的queryString的编码方式是依赖于网页的contentType、meta中的charset字符集设置的,记住这点对于form get方式提交乱码问题排查是非常有好处的。
- 5.
页面文件的编码最好和页面内设置的charset一致,因为我们可能在页面内部有很多中文,若编码不一致,则可能出现在编辑器内看着是正常的,但到了浏览
器上则变成了乱码(虽然页面显示为乱码,但这并不意味着在form
submit时数据会有问题,很可能出现负负为正的情况);这点在前面宝宝的文档中也有说明;
另外,文件的编码很可能会影响问题的排查;比如上例中我们就已说明:文件格式为ANSI/ASCII,若文件格式为Unicode/UTF-*系列,那测试结果会不会不一样呢?大家可以自行测试下; - 6. 服务端URL Encode时最好指定字符集,否则encoding的字符集依赖于本地系统的默认编码。可以参考javadoc:
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/URLEncoder.html
相关文档参考:
字符,字节和编码:http://www.regexlab.com/zh/encoding.htm
各种字符集和编码详解:http://blog.csdn.net/ancky/archive/2008/01/11/2034809.aspx
深入浅出URL编码:http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx
javascript html 相关编码问题研究:http://stauren.net/log/fpev3c89q.html
J2EE Web组件中中文及相关的问题(系列):http://blog.csdn.net/whodsow/archive/2003/10/27/19465.aspx
发表评论
-
中文化和国际化问题权威解析之一:字符编码发展历程
2009-08-11 20:06 822中文化和国际化问题权威解析之一:字 ... -
中文化和国际化问题权威解析之二:Java国际化基础
2009-08-11 20:07 725我们知道 Unicode 为国际化( I18n ... -
中文化和国际化问题权威解析之三:Java中文问题分析
2009-08-11 20:08 698本章从实际的中文问题中,分析问题的根本原因,以及解决之道。 ... -
中文化和国际化问题权威解析之四:Java中文化和国际化攻略
2009-08-11 20:09 692一般攻略 既然在 Java 内部是直接使用 U ... -
中文化和国际化问题权威解析之七:JS中的escape、encodeURI、encodeURIComponent解惑
2009-08-11 20:10 653面一篇文档《中文化和国际化问题权威解析之五:URL编码/Mis ... -
中文化和国际化问题权威解析之六:MIME编码/字符传输编码
2009-08-11 20:10 636MIME(Multipurpose Internet Ma ... -
通过IP地址和子网掩码与运算计算相关地址
2010-03-12 14:41 515通过IP地址和子网掩码 ... -
子网掩码和IP地址计算网络地址和广播地址的换算
2010-03-12 14:50 1152子网掩码和IP地址计算 ... -
更改google桌面搜索的索引文件位置
2010-11-15 09:14 690Google Desktop Search默认的索引文件是保存 ...
相关推荐
URL 编码解码.ec USB.ec USER32.EC user32模块.EC user模块.EC USUAL.EC vcode.ec VERSION.EC ve 模块.ec Vista.ec vistaAERO模块.ec Vista风格化.ec W.y.k_!易模块1.10.ec W.y.k_! 易模块1.18.ec WBCZ.EC WBFH.EC ...
URL 编码解码.ec USB.ec USER32.EC user32模块.EC user模块.EC USUAL.EC vcode.ec VERSION.EC ve 模块.ec Vista.ec vistaAERO模块.ec Vista风格化.ec W.y.k_!易模块1.10.ec W.y.k_! 易模块1.18.ec WBCZ.EC WBFH.EC ...
哈希表源码
sun_3ck_03_0119
内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。
1996-2019年各地级市平均工资数据 1、时间:1996-2019年 2、来源:城市nj、各地级市统计j 3、指标:平均工资(在岗职工) 4、范围:295个地级市
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
内容概要:本文介绍了一种新颖的变压器模型C2Former(Calibrated and Complementary Transformer),专门用于解决RGB图像和红外图像之间的物体检测难题。传统方法在进行多模态融合时面临两个主要问题——模态错位(Modality miscalibration)和融合不准确(fusion imprecision)。作者针对这两个问题提出采用互模交叉注意力模块(Inter-modality Cross-Attention, ICA)以及自适应特征采样模块(Adaptive Feature Sampling, AFS)来改善。具体来说,ICA可以获取对齐并且互补的特性,在特征层面进行更好的整合;而AFS则减少了计算成本。通过实验验证了基于C2Former的一阶段和二阶段检测器均能在现有公开数据集上达到最先进的表现。 适合人群:计算机视觉领域的研究人员和技术人员,特别是从事跨模态目标检测的研究人员,对Transformer架构有一定了解的开发者。 使用场景及目标:适用于需要将可见光和热成像传感器相结合的应用场合,例如全天候的视频监控系统、无人驾驶汽车、无人
上海人工智能实验室:金融大模型应用评测报告-摘要版2024.pdf
malpass_02_0907
C++-自制学习辅助工具
内容概要:本文提供了有关微信生态系统的综合开发指导,具体涵盖了微信机器人的Java与Python开发、全套及特定应用的小程序源码(PHP后台、DeepSeek集成),以及微信公众号的基础开发与智能集成方法。文中不仅给出了各种应用的具体案例和技术要点如图灵API对接、DeepSeek大模型接入等的简述,还指出了相关资源链接以便深度探究或直接获取源码进行开发。 适合人群:有意开发微信应用程序或提升相应技能的技术爱好者和专业人士。不论是初涉者寻求基本理解和操作流程,还是进阶者期望利用提供的资源进行项目构建或是研究。 使用场景及目标:开发者能够根据自身兴趣选择不同方向深入学习微信平台的应用创建,如社交自动化(机器人)、移动互联网服务交付(小程序),或者公众信息服务(公众号)。特别是想要尝试引入AI能力到应用中的人士,文中介绍的内容非常有价值。 其他说明:文中提及的多个项目都涉及到了最新技术栈(如DeepSeek大模型),并且为不同层次的学习者提供从零开始的详细资料。对于那些想要迅速获得成果同时深入了解背后原理的人来说是个很好的起点。
pimpinella_3cd_01_0916
mellitz_3cd_01_0516
schube_3cd_01_0118
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
智慧用电平台建设解决方案【28页】
lusted_3ck_01_0519