中文编码集用的比较多的一般是 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文操作系统部署中就会出现乱码。