中文化和国际化问题浅析之四 Java中文问题分析(阿里巴巴大牛写的)
Java中文问题分析本章从实际的中文问题中,分析问题的根本原因,以及解决之道。
注意
注意,本章虽然着重说明“中文问题”,但本章所推出的结论却是适合于世界所有语言文字的。
概述
我们在实际开发中碰到的中文问题,真是形形色色,无法一一列举。但是它们不是随机产生的,而是有规律可循,有办法解决的。
我们碰到最多的中文问题,都发生在使用Java Servlet写WEB应用时。其次,使用Java Mail API发送e-mail也会有类似的问题。从表象上区分,大致上有以下几种:
[*]好端端的中文显示成了问号“?”,且一个中文变成2个问号。
[*]好端端的中文显示成了问号“?”,且一个中文变成1个问号。
[*]好端端的中文显示成了看不懂的符号,如“ÎÒ°®Alibaba”。
[*]WEB页面中部分中文显示正常,部分中文是乱码。
要分析这些问题的根本原因,首先要了解这些中文字符的输入源,其次是了解这些字符被输出到用户浏览器经过了哪些转换和输出环节。中文字符可以来源于:
[*]程序内嵌的中文,我们在程序里直接书写中文字符串。
[*]文本文件,利用FileInputStream读入文件内容并转换成字符。
[*]XML文件,利用XML解析器读入内存。
[*]数据库,利用SQL查询,取得的结果。
[*]模板文件,例如Velocity或WebMacro模板,我们使用模板生成WEB页面。
[*]JSP页面,在JSP生成的WEB页面。
[*]用户通过浏览器提交的表单。
中文字符被装入内存以后,还要经过若干个转换和输出环节,最后才能到达用户的浏览器被用户看到。
[*]文本通过response.getWriter()输出到浏览器端。
[*]浏览器读取服务器的HTTP响应,并将响应中包含的HTML页面显示在浏览器上。
[*]文本可能被写入XML文件、文本文件、数据库中。
以上列举的任何一个环节发生错误,都可能产生“乱码”现象。因此发生乱码现象时,不要慌,想想这个乱码的文本是从哪里来的,又是以什么方式输出的。
字符的输入、转换、输出环节
内嵌在程序代码中的中文
因为Java源代码(.java)本身是一个文本文件,所以和读普通文本文件一样,编译器(javac)必须以字节流的方式读入文件内容,并以适当的编码转换成Unicode字符而存储在Java字节码文件(.class)中。例如:Java源代码文件中包含GBK编码的中文字符,则使用下面的命令编译:
<div style="border: 1pt solid #cfdced; padding: 0cm;">javac -encoding GBK MyClass.java
页:
[1]