Tuesday, January 24, 2006

Hello Unicode ——JAVA的中文处理学习笔记
是应该根据客户端浏览器设置ServletRequest和ServletResponse用相应语言的编码方式进行输入解码/输入编码,当根据浏览器的头信息中的"Accept-Language"为zh-cn(中文)时,设置请求的解码方式和输出的字符集编码方式使用GBK:
        //auto detect broswer's languages
String clientLanguage = req.getHeader("Accept-Language");

//for Simplied Chinese
if ( clientLanguage.equals("zh-cn") ) {
req.setCharacterEncoding("GBK");
res.setContentType("text/html; charset=GBK");
}
可以把这个写在一个过滤器里,自动设置字符编码。

在Servlet的源代码中尽量不要有中文:因为在MVC模式中,Servlet主要是控制器(C)的角色,因此,应该通过ResourceBundle
机制由Servlet控制转向到相应的显示器(JSP或者XSLT)中,所以应该将与本地界面语言相关的界面显示的部分从Servlet和后台的模块中完
全剥离出来,放到相应的ResourceBundle文件中或者XSLT文件中。这样源程序里完全是英文,编译时完全不需要考虑字符集的问题。

如果Servlet实在需要包含中文,则需要设置应用服务器的Javac编译选项,加上-encoding选项成系统缺省的字符集,如果把用中文编写的字符按照英文方式解码编译,然后再按照英文方式输出,虽然结果表面正确,实际上都成了面向“字节”编程。

在Servlet层,应该像GOOGLE搜索引擎那样,设计成能够根据客户端浏览器的语言环境自适应输出,为了判断浏览器的语言Servlet中应该有类似以下的代码:
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
//从HTTP请求的头信息中获取客户端的语言设置
String clientLanguage = req.getHeader("Accept-Language");

//简体中文浏览器
if ( clientLanguage.equals("zh-cn") ) {
req.setCharacterEncoding("GBK");
res.setContentType("text/html; charset=GBK");
}
//繁体中文浏览器
else if ( clientLanguage.equals("zh-tw") ) {
req.setCharacterEncoding("BIG5");
res.setContentType("text/html; charset=BIG5");
}
//日文浏览器
else if ( clientLanguage.equals("jp") ) {
req.setCharacterEncoding("SJIS");
res.setContentType("text/html; charset=SJIS");
}
//缺省认为是英文浏览器
else {
req.setCharacterEncoding("ISO-8859-1");
res.setContentType("text/html; charset=ISO-8859-1");
}
...
//设置好request的解码方式和response的编码方式后,进行后续的操作。
//比如再转向到HelloWorld.gbk.jsp HelloWorld.big5.jsp HelloWorld.jis.jsp等
}

No comments: