没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
java中文解决大全
Abstract:本文深入分析了 Java 程序设计中 Java 编译器对 java 源文件和 JVM 对 class 类文件的编码/解码过
程,通过此过程的解析透视出了 Java 编程中中文问题产生的根本原因,最后给出了建议的最优化的解决
Java 中文问题的方法。
1. 中文问题的来源
计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单
字节编码的英文为准进行处理。随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),
人们提出了 UNICODE 编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目
前,大多数国际性的软件内部均采用 UNICODE 编码,在软件运行时,它获得本地支持系统(多数时间是
操作系统)默认支持的编码格式,然后再将软件内部的 UNICODE 转化为本地系统默认支持的格式显示出
来。Java 的 JDK 和 JVM 即是如此,我这里说的 JDK 是指国际版的 JDK,我们大多数程序员使用的是国际
化的 JDK 版本,以下所有的 JDK 均指国际化的 JDK 版本。我们的汉字是双字节编码语言,为了能让计算
机处理中文,我们自己制定的 gb2312、GBK、GBK2K 等标准以适应计算机处理的需求。所以,大部分的
操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是 GBK,GB2312 编码格式以
正确显示我们的汉字。如:中文 Win2K 默认采用的是 GBK 编码显示,在中文 WIN2k 中保存文件时默认
采用的保存文件的编码格式也是 GBK 的,即,所有在中文 WIN2K 中保存的文件它的内部编码默认均采用
GBK 编码,注意:GBK 是在 GB2312 基础上扩充来的。
由于 Java 语言内部采用 UNICODE 编码,所以在 JAVA 程序运行时,就存在着一个从 UNICODE 编码
和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如
果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的 JAVA 中文问题。
同时,Java 是一个跨平台的编程语言,也即我们编写的程序不仅能在中文 windows 上运行,也能在中文
Linux 等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中文 win2k 上编写的
JAVA 程序,移植到英文 Linux 上运行)。这种移植操作也会带来中文问题。
还有,有人使用英文的操作系统和英文的 IE 等浏览器,来运行带中文字符的程序和浏览中文网页,它
们本身就不支持中文,也会带来中文问题。
几乎所有的浏览器默认在传递参数时都是以
UTF-8 编码格式来传递,而不是按中文编码传递,所以,
传递中文参数时也会有问题,从而带来乱码现象。
总之,以上几个方面是 JAVA 中的中文问题的主要来源,我们把以上原因造成的程序不能正确运行而产
生的问题称作:JAVA 中文问题。
2. JAVA编码转换的详细过程
我们常见的 JAVA 程序包括以下类别:
*直接在 console 上运行的类(包括可视化界面的类)
*JSP 代码类(注:JSP 是 Servlets 类的变型)
*Servelets 类
*EJB 类
*其它不可以直接运行的支持类
这些类文件中,都有可能含有中文字符串,并且我们常用前三类 JAVA 程序和用户直接交互,用于输出
和输入字符,如:我们在 JSP 和 Servlet 中得到客户端送来的字符,这些字符也包括中文字符。无论这些
JAVA 类的作用如何,这些 JAVA 程序的生命周期都是这样的:
*编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java 扩展名保存在操作
系统中,例如我们在中文 win2k 中用记事本编辑一个 java 源程序;
*编程人员用 JDK 中的 javac.exe 来编译这些源代码,形成.class 类(JSP 文件是由容器调用 JDK 来编译
的);
*直接运行这些类或将这些类布署到 WEB 容器中去运行,并输出结果。
那么,在这些过程中,JDK 和 JVM 是如何将这些文件如何编码和解码并运行的呢?
这里,我们以中文 win2k 操作系统为例说明 JAVA 类是如何来编码和被解码的。
第一步,我们在中文win2k中用编辑软件如记事本编写一个Java源程序文件(包括以上五类JAVA程序),
程序文件在保存时默认采用了操作系统默认支持GBK编码格式(操作系统默认支持的格式为file.encoding格
式)形成了一个.java文件,也即,java程序在被编译前,我们的JAVA源程序文件是采用操作系统默认支持
的file.encoding编码格式保存的,java源程序中含有中文信息字符和英文程序代码;要查看系统的
file.encoding参数,可以用以下代码:
public class ShowSystemDefaultEncoding {
public static void main(String[] args) {
String encoding = System.getProperty("file.encoding");
System.out.println(encoding);
}}
第二步,我们用JDK的javac.exe文件编译我们的Java源程序,由于JDK是国际版的,在编译的时候,如
果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采
用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的
file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们
的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转
换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,
紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文
件。对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们
源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。
这一步中,对于 JSP 源程序文件是不同的,对于 JSP,这个过程是这样的:即 WEB 容器调用 JSP 编译
器,JSP 编译器先查看 JSP 文件中是否设置有文件编码格式,如果 JSP 文件中没有设置 JSP 文件的编码格
式,则 JSP 编译器调用 JDK 先把 JSP 文件用 JVM 默认的字符编码格式(也即 WEB 容器所在的操作系统的
默认的 file.encoding)转化为临时的 Servlet 类,然后再把它编译成 UNICODE 格式的 class 类,并保存在临
时文件夹中。如:在中文 win2k 上,WEB 容器就把 JSP 文件从 GBK 编码格式转化为 UNICODE 格式,然
后编译成临时保存的 Servlet 类,以响应用户的请求。
第三步,运行第二步编译出来的类,分为三种情况:
A、 直接在 console 上运行的类
B、 EJB 类和不可以直接运行的支持类(如 JavaBean 类)
C、 JSP 代码和 Servlet 类
D、 JAVA 程序和数据库之间
下面我们分这四种情况来看。
a) 直接在 console 上运行的类
这种情况,运行该类首先需要 JVM 支持,即操作系统中必须安装有 JRE。运行过程是这样的:首先 java
启动 JVM,此 时 JVM 读出操作系统中保存的 class 文件并把内容读入内存中,此时内存中为 UNICODE 格
式的 class 类,然后 JVM 运行它,如果此时此类需要接收用户输入,则类会默认用 file.encoding 编码格式
对用户输入的串进行编码并转化为 unicode 保存入内存(用户可以设置输入流的编码格式)。程序运行后,
产生的字符串(UNICODE 编码的)再回交给 JVM,最 后 JRE 把此字符串再转化为 file.encoding 格式(用户
可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。
剩余14页未读,继续阅读
资源评论
字节卷动
- 粉丝: 4w+
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mybatis中的动态sql, 涉及 where trim set if foreach等
- 简单- 快递运输(Java & JS & Python & C).html
- mybatis框架 更改ems系统,使用动态sql等.zip
- 易语言工具条下拉菜单实现
- Mybatis动态SQL高级映射.zip
- 源码esp8266开发板机智云机智云智能灯
- Python实现多图像转换成连贯的PDF文件,支持所有图片格式,可预览、裁剪、自定义PDF布局、设置图像顺序、PDF质量选择等
- H5腾讯地图选择位置组件
- 基于UCC28019+LM5017电源板硬件(原理图+PCB)工程文件.zip
- 源码esp8266开发板机智云机智云空气净化器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功