中文编码集用的比较多的一般是 GBK 和 GB2312 , GBK 是 GB2312 的扩展集。国际上通用的字符集有 unicode 、 UTF-8 、 iso8859_1 等,这几个字符集使用都非常广泛,比如 java 内部使用的是 unicode 字符集,几乎所有的数据库和 web 容器内部默认编码都是 iso8859_1 ,浏览器用 UTF-8 传递页面参数。

由于中文字符集和国际标准字符集的不同,所以我们在项目开发中必然面临到编码转换的问题,在 j2ee 开发中尤其如此, java 是一个国际化、跨平台的编程语言,需要部署在不同的 os 中,并且需要和跑在不同 os 上的 db 打交道,稍有不慎就会出现乱码的问题。

下面列举一下在日常开发时可能碰到的中文乱码问题:

1、  在中文 windows 系统上部署 j2ee ,访问 jsp 页面中文显示正常,而移植到中文或者英文的操作系统上,访问页面时就出现乱码。

2、  页面上静态显示的中文没有乱码问题,而从数据库中读出来的中文在页面上显示总是乱码。

3、  在页面表单上填写汉字提交后,数据库中内容为乱码

下面分析一下原因:

1、 中文操作系统和英文操作系统中, file.encoding 值是不一样的,比如中文 linux 上的 file.encoding 值为 gbk, 而英文 linux 上的就不是该值。 file.encoding 在 java 开发中至关重要,用编辑器编写 .java 文件会按照 file.encoding 指定的编码保存, javac 编译 .java 文件时先把文件从 file.encoding 转换到 unicode 放入内存,然后转换为 .class 文件。 jvm 加载类时,把 .class 以 unicode 放入内存,如果该类要接受输入时,对于用户的输入, jvm 自动把内容由 file.encoding 转码为 unicode ,然后再送给 ,class 处理;反之,输出内容时, jvm 完成从 unicode 到 file.encoding 的转换。

2、对于 JSP 文件, WEB 容器调用 JSP 编译器, JSP 编译器先查看 JSP 文件中是否设置有文件编码格式,如果 JSP 文件中没有设置编码格式,则 JSP 编译器调用 JDK 先把 JSP 文件用 JVM 默认的字符编码格式 ( 也即 WEB 容器所在的操作系统的默认的 file.encoding) 转化为临时的 Servlet 类,然后再把它编译成 UNICODE 格式的 class 类,并保存在临时文件夹中。如果 jsp 文件中设置了编码格式, jvm 会用该编码格式来编译JSP文件.所以当你的jsp文件中没有设置编码格式时,在中文操作系统上是没有问题的,而在e文操作系统部署中就会出现乱码。