|
|
1.前言 2.从“HelloWorld”开始 3.用“我们是害虫”替换“HelloWorld” 4.可能存在的意外
1.前言 有很多文章对Java的中文问题进行了论述,论坛上的许多问题也与此有关,所以中文问题实在是Java应用中的一个不小的问题。尽管已经有这么多的参考资料,但是由于Java的应用范围实在太广,包含的内容太多,虽然问题的根源往往万变不离其宗,然而很容易乱花渐欲迷人眼,导致各种各样的问题层出不穷。 总的说来,Java的中文问题较多的出现在数据传输的场合,比如数据从A传递到B,将B得到的数据显示出来可能就成了乱码。Java中文问题产生的根源是编码,如果A和B存放字符的编码不同,则乱码就产生了。 下面我就将iText中所遇到的一些中文问题进行一下力所能及的阐述,恐言有所未逮,不能尽善尽美,面面俱到之处,权当抛砖引玉耳。 我将分两个部分进行阐述,一个是application中的中文问题,一个是在JSP中的中文问题。 iText是一个用来生成PDF文件的开源类库,详细情况和用法请参考http: //www.lowagie.com/iText/tutorial/index.html,下载请至http://sourceforge.net/projects/itext。如果有必要的话我会再写一篇iText的简单介绍。 ************************************
2.iText在Java Application中的中文问题
1)从“HelloWorld”开始 我们从iText的一个入门程序开始:
- import java.io.FileOutputStream;
- import java.io.IOException;
- import com.lowagie.text.*;
- import com.lowagie.text.pdf.PdfWriter;
- public class Chap0101 {
- public static void main(String[] args) {
- System.out.println("Chapter 1 example 1: Hello World");
- // step 1: creation of a document-object
- Document document = new Document();
- try {
- // step 2:
- // we create a writer that listens to the document
- // and directs a PDF-stream to a file
- PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));
- // step 3: we open the document
- document.open();
- // step 4: we add a paragraph to the document
- document.add(new Paragraph("Hello World"));
- }
- catch(DocumentException de) {
- System.err.println(de.getMessage());
- }
- catch(IOException ioe) {
- System.err.println(ioe.getMessage());
- }
- // step 5: we close the document
- document.close();
- }
- }
该程序在PDF文件中写入HelloWorld,编译并运行该程序,我们可以在同级目录下得到一个名为“Chap0101”的PDF文件,打开这个文件,就可以看到左上角的“HelloWorld”。 这样我们就完成了一个几乎就是最简单的PDF文件的制作,有心的朋友可能就想,如果把HelloWorld替换成中文字符效果如何。好的!
2)用“我们是害虫”替换“HelloWorld” 我们把document.add(new Paragraph("HelloWorld"));改成document.add(new Paragraph("我们是害虫"));然后编译运行,得到一个PDF文件,但是打开却发现,没有任何字符。添加中文字符失败!PDF文件完全不认这里的中文字符。 iText添加中文字符,需要设置相应的编码和字体。 在程序开端添加import com.lowagie.text.pdf.BaseFont;引入所需要的类。 然后将中文字符做成字符串:String chinese =”我们是害虫”; 设置字体和编码:BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font FontChinese = new Font(bfChinese, 12, Font.NORMAL); 加入document: Paragraph chunk = new Paragraph(chinese, FontChinese); document.add(chunk); 此时要正确编译,还需要下载一个包,该包包含了中、日、韩文字的一些字体和编码。该包名为iTextAsian.jar,访问http://itext.sourceforge.net/downloads/iTextAsian.jar可以下载。 下载后加入classpath,则程序可以正确编译运行了。
3)可能存在的意外 一般来说,按照上述的步骤将中文字符加入到PDF文件中,是没有问题的。为什么这么说呢?这样就不得不说到Java的编译器javac。 如果我们在命令行中输入javac然后回车,就可以看到屏幕上会输出一些javac的相关参数。其中有一个是encoding。我们一般很少用到这个参数,其实这个参数对于java的跨平台非常重要。如果在编译时不指定这个参数,则系统默认:在中文平台上为gb2312,英文平台上为ISO8859_1。编译器就是根据这个参数来读取java文件的,然后把用utf-8形式编译成class文件。 想象一下,如果此时所用为英文操作系统,则在不指定encoding参数的情况下,javac以ISO8859_1为编码读取java文件,则中文字符串必定不能顺利读出,于是在PDF中出现乱码!! 我们可以将上面可以正确生成中文的java文件重新编译和执行,指定encoding参数为ISO8859_1:javac ?Cencoding ISO8859_1 ……打开生成的PDF文件,你可以看到奇形怪状的乱码。 我们一般用的都是中文平台,所以上述“凑巧”不会碰到,但是以后如果真遇上了这样的场合,只要指定encoding为相应的编码就可以了。 还有一种方法就是将字符串放在文本文件中,用相应的编码保存,然后在程序中利用流读进来。
|
|