Chen Yangjian's Blog

Carpe diem - Seize the day

Ajax, Java Servlet, iText, Oracle 的中文问题

| Comments

标题有点长…… 而且有点大…… 其实本文就是我最近2、3天碰到的一些问题以及干掉它们的一些方式的记录而已。这四个东西是我个人最近在开发的一个小项目所用到的。前些天,同事们一致要求加入中文,就苦了我了。

闲话休提,原型并不能处理中文,但是好在后台的 Oracle 已经使用了 GBK 编码。要查看自己的 Oracle 是否用的也是 GBK,执行这个就行了:

select * from nls_database_parameters
where parameter='NLS_CHARACTERSET'

如果是的话,返回的是 ZHS16GBK。而我的前端使用的编码都是 UTF-8,所以我开始一直在纠结如何将字符编码从 GBK 转到 UTF-8。例如,

text = new String( text.getBytes(“iso8859-1”),”gbk”);

后来终于看到《Java 编码浅析》,才发现原来的理解方式是错的,Java 中的 String 编码肯定是 Unicode,而 ResultSet.getString() 默认取出来的似乎就可用了,手工转换似乎是多此一举。结果我什么代码都没加,就将返回的文件头加了一句。

resp.setContentType("text/xml; charset=utf-8");

$.get() 就正确显示中文了,fx 与 ie6 都正常。

再说 $.post(),fx 里头是没有问题的,最终插入到 fx 里头的内容在 sqldeveloper 中正常显示,xml 文档编码搞定之后在网页中也正常。但是在 ie6 里头却挂掉了。起先考虑的是 contentType 参数问题,去看了下 $.ajax() 文档,据说默认的能够应付绝大多数情况,就不再怀疑,改怀疑 Servlet 的 request.getParameter()。看了另一篇 javaeye 的技术文之后,加上了这句:

request.setCharacterEncoding("UTF-8");

就没问题了…… 提醒一下,这句代码要加在 .getParameter() 之前。

最后是 iText,这东西还是挺好用的,就是刚开始的时候我思维方式有点转不过来。中文问题主要是两个,乱码,其一;碰到中文文字不显示的话就是字体的问题了,其二。一律不掺和编码转换之后,中文就不显示了,所以就去找设置字体的办法。侥幸找到一个,似乎年代久远,属于遗产技术文,iTextAsia.jar 也早已不复存在。BaseFont 类如今在 com.lowagie.text.pdf 包里头。而第一种方式里头的字体是由那个变身亡魂的 jar 包自带的,也就不好用了。第二种方式可行,但是选择 .ttc 的时候它会不认…… 不晓得啥问题,懒得弄了,下了微软官方的 yahei.ttf 凑合着用。

如果你的情况是 GBK 编码的话,我就不晓得啦。我对这些东西理解不深…… 也不求甚解。

Comments