收藏 分享(赏)

J2ee应用中文乱码问题解决方案.doc

上传人:dzzj200808 文档编号:2284921 上传时间:2018-09-09 格式:DOC 页数:7 大小:50KB
下载 相关 举报
J2ee应用中文乱码问题解决方案.doc_第1页
第1页 / 共7页
J2ee应用中文乱码问题解决方案.doc_第2页
第2页 / 共7页
J2ee应用中文乱码问题解决方案.doc_第3页
第3页 / 共7页
J2ee应用中文乱码问题解决方案.doc_第4页
第4页 / 共7页
J2ee应用中文乱码问题解决方案.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、J2ee 国际化应用 utf-8 解决方案笔记到现在为止, 陆续接触了几个项目, 这几次都使用了不同的编码, 感觉在国际化时, 中文问题上屡屡碰到问题, 每次都需要费点时间, 现在抽点时间总结一下, 也为同事以及以后的项目提供一些参考。(utf-8 是 unicode 的一种编码表现形式, 他能很好的兼容单字节编码格式)项目名称 前台 jsp 编码, 显示 Class 类 数据库Webuniverse UTF-8, GB2312, GBK混合使用Unicode ISO-8859-1BookManagement GB2312 Unicode IOS-8859-1Workflow UTF-8 Un

2、icode UTF-81. 字符集首先简要介绍一下字符集的概念, 这部分是从网上整理而来:1.1. 单字节字符集ASCII 码,它以 8bit 字节为单位存储,0-31 及 127 为控制符,32-126 为可见字符, 128-255 的 ASCII 码则没有定义。 为美国所使用。ISO-8859-1 是 ASCII 扩展到 0-255 的范围形成的。为西欧所扩展。1.2. 双字节字符集GB2312 第一个字节大于 127,则使用两个字节来组成一个汉字。若小于 127, 仍用一个字节来表示 ASCII 码定义的字符。GBK 保持与 GB2312 兼容, 并含繁体中文字,日文字符和朝鲜字符。GB

3、K 是现阶段Windows 及其他一些中文操作系统的缺省字符集。BIG5(台湾 ) SJIS(日本) 这两种编码与 GB2312 类似, 但扩展 ASCII 码的那部分编码方式是不一样的。1.3. 多字节字符集Unicode 定义了 31 位的字符集 , 现在基本上只使用了 16 位子集。U+0000 到 U+007F 与 ASCII 是一致的, U+0000 到 U+00FF 与 ISO 8859-1 也是一致的。但每个字符都用 16bit来保存。UTF-8 是 Unicode 的一种表达方式, 它即兼容了单字节字符集, 又以一种组码方式实现了所有的字符集。另外单字节字符不可能成为多字节字符

4、的一部分。2. 中文字符乱码的原因 2.1. 要注意编码的地方下面是我实践加理解整理出来的东西, 也可能会有严重错误, 希望大家不啻指教。2.1.1. jsp 页面 JSP 编码格式保存 jsp 页面的时候, 我们可以指定各种格式 , 比如 GBK, utf8 等等。读取和编译时, 用来指定容器是以什么格式读取这个 jsp 页面的。不指定的话 , 容器会获取操作系统的 file.encoding, 比如中文操作系统为 GBK, 存成 Unicode 格式。然后容器会把它编译成 Unicode 编码的 class 类。 页面显示格式它表示强制浏览器编码设为 gb2312。这个设定对网页交互很有关

5、系, 你设定了什么编码, 之后你提交的请求就会按照这种编码格式来编码发送。比如,post 一个用户名: name=松然utf-8 下会发送: name=%E6%9D%BE%E7%84%B6GB2312 下发送: name=%CB%C9%C8%BBTomcat 默认总是使用 ISO-8859-1, 这就是说你用 GBK 编码的中文传到 tomcat 中, 在servlet 里默认输出 System.out.println()总会得到乱码。 容器参数接收如上面所提的, 参数的传递方式跟页面显示编码的设定有关。那服务器端又是如何处理参数的呢?若不指定容器接受参数时采用的编码格式,则 WEB 容器会默

6、认采用 ISO-8859-1 编码格式来接受传入的值并在 JVM 中转化为 UNICODE 格式的保存在 WEB 容器的内存中。 容器参数输出若不指定容器接受参数时采用的编码格式,则 WEB 容器会默认采用 ISO-8859-1 编码格式来输出内容到客户端浏览器上。2.2. 编码解决方式乱码的根本原因就是前后编码方式不一致, 所以乱码问题总共两种解决方式,:1. 不同编码交接处进行转码2. 统一使用同一种编码下面会着重讨论这两种方式的实际应用。2.3. 不同编码方式由于现下流行的一些服务器, 或数据库基本上是西方国家生产的, 所以他们默认支持 ISO-8859-1 就不显得奇怪了, 甚至有些还

7、不支持 UTF-8, 比如 Mysql4.0 以前版本就支持不好, Mysql4.1 在 linux 下也配置 UTF-8 我现在的解决方式是需要重新编译源文件。 Tomcat, Mysql, SQLServer 等程序默认都是 ISO-8859-1。所以我们以后开发其他项目时需要注意一下。这种方式下, 只要搞清楚取的时候是什么编码, 存的时候是什么编码, 就没有问题的。另外, 别忘了 java 系统和 JDBC 驱动本身会帮助我们进行编码转换, 而且不同的数据库驱动会返回不同的编码的内容。具体转换就不再这里赘述了, 有兴趣的同事可以相互交流。下面就公司几个项目实施中提取一些反复实践或推论出的

8、东西, 和大家一起分享和研究。2.3.1. 网宇管理平台虽然网宇管理平台很好的支持了国际化, 但内部开发由于各开发人员以不同的实现方式解决了乱码问题。下面描述了一下从 JSP 编译到用户交互整个过程的编码转换工作。有兴趣的人可以去查看一下具体实现。网宇管理平台具有代表性的编码转换:如更新虚拟主机众模块:JSP utf-8 unicode 编码的 servlet参数 utf-8 iso-8859-1 Unicode 容器保存的变量容器输出 unicode iso-8859-1 客户端 (用 utf-8 编码来显示)如修改 mail 服务模块:JSP gb2312 unicode unicode

9、编码的 servlet参数 gb2312 iso-8859-1 Unicode 容器保存的变量参数处理 iso-8859-1 gb2312 得到变量改写部署文件 gb2312 Unicode 以 unicode 构建 xml 文件容器输出 Unicode iso-8859-1 客户端 (用 gb2312 编码来显示)2.3.2. 图书管理系统虽然图书管理系统没有做成国际化, 但需要打交道的应用服务器, web 容器, 数据库都是默认 IOS-8859-1, 所以也很有必要分析中文问题, 实际上也是遇到了。为什么图书管理系统除了 jsp 设置了 IE 使用 gb2312 编码显示之外, web

10、应用中没有使用一个整个过程的编码转换工作, 我理解如下:JSP gb2312 unicode 具体的 servlet参数 gb2312 iso-8859-1 Unicode 容器保存的变量容器 Unicode iso-8859-1 客户端 (使用 gb2312 编码来显示)为什么 iso-8859-1 可以用来支持中文呢 , 我的比较合理的理解是: iso-8859-1 虽然是单字节的编码方式 , 而 GBK 和 GB2312 是多字节的编码方式, 但由于两种编码都使用了 0-255 整个字节 , 所以把 GB2312 编码的东西直接看成是 ios-8859-1, 再转成 unicode, 再

11、转成 iso-8859-1, 最后使用 gb2312 显示, 会呈现正确的结果 , 望有兴趣的人再深入探讨。2.4. 统一编码看到标题就可以知道, 至少这种方式有一种优势, 那就是不用进行任何转码。工作流项目基本上就是按照这种方式进行开发的。包括所有文件使用 utf-8 格式保存 : 属性文件 jsp, html: JSP 编码格式和页面显示格式都设置成 utf-8 设置数据库的存,取方式为 utf-8, 设置 tomcat 存取方式也为 utf-8。所以只是一种比较好的解决方式。3. 编程涉及地方说明值得一提的是,因为考虑到程序中处理的信息大多是西文信息,因此有些 WEB 容器(如:Tomc

12、at4.x)在处理所接收到的 request 字符串时,如果您没指定 request 的编码方式则系统就缺省地采用 ISO-8859-1,明白这一点对理解后面的问题会有帮助。另外若数据库等使用 ISO-8859-1 好多时候也是可以实现一些中文, 原因我上面已经阐述了一下。4. 具体解决方案4.1. post 方法的解决方案编写一个过滤器, 若请求没有设定编码, 则把请求编码设置为参数指定的 utf-8。request.setCharacterEncoding(encoding);在你的 web.xml 里加入如下几行: Set Character Encodingfilters.SetCha

13、racterEncodingFilterencodingUTF-8Set Character Encoding/*4.2. get 方式的解决办法4.2.1. 服务器设置Tomcat5.0 中, 过滤器对 get 方法是不起作用的 , 所以要用下面这种方式来解决 get 方法带参数时情况。打开 tomcat 的 server.xml 文件,找到区块,加入如下一行:URIEncoding=”utf-8”完整的应如下:4.2.2. 参数编码并且在 get 方法带参数时, 需要注意虽然页面时 utf-8 编码, 但附带的参数需要提前编码完之后再发请求。 新的请求 URL 中带有中文情况下需要二次编码

14、, 请求前先把请求编码为UTF-8。因为 URL 本身是不会被正确编码的, 所以需要提前编码好后, 再发送。如工作流中的修改组:“ 显示为但若凑巧整个参数在提交过程中参数长短刚好不会被抛弃一部分, 刚才提到的二次编码不需要进行也可以顺利完成整个过程。因为整个过程都是 utf-8 编码的。4.2.3. J2EE 应用中数据库要注意的地方 数据源中要设置连接的编码, 如下:jdbc:mysql:/192.168.1.142:3306/jbpm?useUnicode=truecharacterEncoding=utf8 数据库要使用 utf-8 方式启动比如 mysql, 在 linux 下, 可以通过编译源文件产生一个 utf-8 数据库在 windows 下, 普通安装的数据库可以通过 mysqld -default-character-set=utf8 启动支持utf-8 的数据库

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报