开发手册 欢迎您!
软件开发者资料库

Unicode支持

JasperReports Unicode支持 - 使用从环境设置,报告设计,编译报告设计,填充报告,查看和打印报告,导出,参数,数据源开始的基础知识到高级知识的初学者教程,简单轻松地学习设计和创建JasperReports。字段,表达式,变量,部分,组,样式,Scriplets,子报告,图表,Corsstabs和国际化。

在JasperReports中,处理文本需要一些专用工具来处理字符表示和文本格式化属性.任何文本都可以被视为具有特定表示结构的字符序列.文本外观包括布局(和段落)和字体设置.但在大多数情况下,文本布局保持不变,在不同的语言环境中运行报表时字体设置可能会发生变化.

我们知道不同的语言需要不同的字符集来表示特定的字符表示.因此,使用文本意味着使用字体.但是,有关如何在JasperReports中使用字体的详细讨论,请参见报告字体一章.

有关特定报告中文本内容的主要特征之一是将其国际化的可能性.这意味着,我们可以在不同的本地化环境中运行报告,使用不同的语言和其他本地化设置,而无需任何硬编码修改.当报告要国际化时,字符编码是一个重要特征.

字符编码

字符是传达有意义的最小写作单位信息.它是一个抽象的概念,一个角色没有视觉外观. "大写拉丁语A"是与"小写拉丁语a"和"大写西里尔语A"和"大写希腊语Alpha"不同的字符.

字符的直观表示称为 字形 的.某组字形称为 字体 . "大写拉丁语A","大写西里尔语A"和"大写希腊字母"可能具有相同的字形,但它们是不同的字符.同时,"大写拉丁字母A"的字形在Times New Roman,Gill Sans和Poetica斜体斜体中看起来非常不同,但它们仍然代表相同的字符.

集合可用字符的名称称为字符指令表.曲目中给定字符的位置(索引)称为其代码位置或代码点.在给定指令集中数字表示代码点的方法称为字符编码.

编码通常以八位字节表示.八位字节是一组八个二进制数字,即八个1和0.八位字节可以表示0到255之间或0x00和0xFF之间的数字范围,以使用十六进制表示法.

Unicode

Unicode是一个包含世界语言中使用的大多数字符的角色曲目.它可以容纳数百万个字符,并且已经包含数十万个字符. Unicode分为64K字符的"平面".在大多数情况下使用的唯一一个是第一个平面,称为基本多语言平面,或BMP.

UTF-8是推荐的编码.它使用可变数量的八位字节来表示不同的字符.

在JRXML文件中,编码属性在标题中指定.它在报告编译时用于解码XML内容.例如,如果报告仅包含法语单词和诸如ç,é,â等字符,那么ISO-8859-1(也称为Latin-1)编码就足够了 :

<?xml version ="1.0"encoding ="ISO-8859-1"?>

如上所示,理想情况下,我们可以选择适合最小字符集的编码,这可以正确表示文档中的所有字符.但是对于多语言文档(即包含以多种语言拼写的单词的文档),应该选择适合于最小字符集的编码,能够正确地表示文档中的所有字符,即使它们属于不同的语言.其中一个能够处理多语言文档的字符编码是 UTF-8 ,用作JasperReports的默认编码值.

文本通常保存在资源包中文件而不是国际化期间的文件.因此,在某些情况下,JRXML本身看起来完全与ASCII兼容,但在运行时生成的报告确实包含ASCII无法读取的文本.因此,对于某种类型的文档导出格式(例如CSV,HTML,XHTML,XML和文本),还必须知道生成的文档的编码.不同的字符编码支持不同的语言.所以每次我们都需要在本地化环境中运行报告.此外,我们必须知道,这是生成的文档语言最合适的字符编码.在这种情况下,JRXML文件本身定义的编码属性可能不再有用.

要解决此类问题,我们可以使用称为 net的导出客户属性. sf.jasperreports.export.character.encoding 的.此导出自定义属性默认为UTF-8并存在于JasperReports中.

此默认值在 default.jasperreports.properties 文件中设置.对于导出时更具体的选项,CHARACTER_ENCODING导出参数也可用.

示例

为了演示在Jasperreports中使用unicode支持,让我们写新的报告模板(jasper_report_template.jrxml). 将其保存到C:\tools\jasperreports-5.0.1 \ test 目录.在这里,我们将使用Unicode字符(\ uXXXX)显示不同语言的文本.使用UTF-8编码的任何字符只能使用其4位十六进制代码表示.例如,希腊字母Γ可以写成\\\Γ.当遇到这样的符号时,引擎会在字符集中调用适当的字符表示,并且只打印出该特定字符. JRXML的内容如下 :

                                                                                          <band height = "782">                  <textField>            <reportElement x = "0" y = "50" width = "200" height = "60"/>                        <textElement>               <font fontName = "DejaVu Sans" size = "14"/>            </textElement>                        <textFieldExpression class = "java.lang.String">               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>            </textFieldExpression>         </textField>                  <staticText>            <reportElement x = "210" y = "50" width = "340" height = "60"/>            <textElement/>                        <text>               <![CDATA["GreekText and CyrillicText"]]>            </text>         </staticText>                  <textField>            <reportElement x = "0" y = "120" width = "200" height = "60"/>                        <textElement>               <font fontName = "DejaVu Sans" size = "14" isBold = "true"/>            </textElement>                        <textFieldExpression class = "java.lang.String">               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>            </textFieldExpression>         </textField>                  <staticText>            <reportElement x = "210" y = "120" width = "340" height = "60"/>            <textElement/>            <text><![CDATA["GreekText and CyrillicText"]]></text>         </staticText>                  <textField>            <reportElement x = "0" y = "190" width = "200" height = "60"/>                        <textElement>               <font fontName = "DejaVu Sans" size = "14" isItalic = "true"                   isUnderline = "true"/>            </textElement>                        <textFieldExpression class = "java.lang.String">               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>            </textFieldExpression>         </textField>                  <staticText>            <reportElement x = "210" y = "190" width = "340" height = "60"/>            <textElement/>            <text><![CDATA["GreekText and CyrillicText"]]></text>         </staticText>                  <textField>            <reportElement x = "0" y = "260" width = "200" height = "60"/>                        <textElement>               <font fontName = "DejaVu Sans" size = "14" isBold = "true"                   isItalic = "true" isUnderline = "true"/>            </textElement>                        <textFieldExpression class = "java.lang.String">               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>            </textFieldExpression>         </textField>                  <staticText>            <reportElement x = "210" y = "260" width = "340" height = "60"/>            <textElement/>            <text><![CDATA["GreekText and CyrillicText"]]></text>         </staticText>         <textField>            <reportElement x = "0" y = "330" width = "200" height = "60"/>                        <textElement textAlignment = "Right">               <font fontName="DejaVu Sans" size = "22"/>            </textElement>                        <textFieldExpression class = "java.lang.String">               <![CDATA[$P{ArabicText}]]>            </textFieldExpression>         </textField>                  <textField>            <reportElement x = "210" y = "330" width = "340" height = "60"/>                        <textElement textAlignment = "Right">               <font fontName = "DejaVu Sans" size = "22"/>            </textElement>                        <textFieldExpression class = "java.lang.String">               <![CDATA[$P{HebrewText}]]>            </textFieldExpression>         </textField>            </band>   

在上面的文件中,我们可以看到UTF-8编码的存在.本地化的Unicode文本也存储在文档参数中.

填写和生成报告的java代码如下所示.我们将此文件 JasperUnicodeReportFill.java 保存到C:\tools\jasperreports-5.0.1\test\src\com\it1352

package com.it1352; import net.sf.jasperreports.engine.JREmptyDataSource;import net.sf.jasperreports.engine.JRException;import net.sf.jasperreports.engine.JasperFillManager;public class JasperUnicodeReportFill {   public static void main(String[] args) {      String sourceFileName ="C://tools/jasperreports-5.0.1/test/" +          "jasper_report_template.jasper";      try {         JasperFillManager.fillReportToFile(sourceFileName, null,             new JREmptyDataSource());      } catch (JRException e) {         // TODO Auto-generated catch block         e.printStackTrace();      }   }}

这里我们使用 JREmptyDataSource 填写报表以模拟其中包含一条记录的数据源,但此单条记录中的所有字段均为 null .

报告生成

我们将使用常规的ANT构建过程编译并执行上述文件.文件build.xml的内容(保存在目录C:\tools \jasperreports-5.0.1 \ test下面)如下所示.

导入文件 -  baseBuild.xml从环境设置一章中挑选,并且应该与build.xml放在同一目录中.

                                                                                                                                                                        

接下来,让我们打开命令行窗口并转到build.xml所在的目录.最后,执行命令 ant -Dmain-class = com.it1352.JasperUnicodeReportFill (viewFullReport是默认目标),如下所示 :

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.IT屋.JasperUnicodeReportFillBuildfile: C:\tools\jasperreports-5.0.1\test\build.xmlclean-sample:   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprintcompile:   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:   warning: 'includeantruntime' was not set, defaulting t   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classescompilereportdesing:   [jrc] Compiling 1 report design files.   [jrc] log4j:WARN No appenders could be found for logger   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).   [jrc] log4j:WARN Please initialize the log4j system properly.   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.run:   [echo] Runnin class : com.IT屋.JasperUnicodeReportFill   [java] log4j:WARN No appenders could be found for logger   (net.sf.jasperreports.extensions.ExtensionsEnvironment).   [java] log4j:WARN Please initialize the log4j system properly.viewFillReport:   [java] log4j:WARN No appenders could be found for logger   (net.sf.jasperreports.extensions.ExtensionsEnvironment).   [java] log4j:WARN Please initialize the log4j system properly.BUILD SUCCESSFULTotal time: 4 minutes 1 second

由于上面的编译,JasperViewer窗口打开up如下面给出的屏幕所示 :

Jasper Report Unicode Example

在这里,我们可以看到显示的文本是不同的语言.我们还看到语言在同一页面上组合在一起,并且也混合到同一个文本元素中.