📜  Unicode支持

📅  最后修改于: 2020-11-16 08:03:36             🧑  作者: Mango


在JasperReports中,使用文本需要一些专用工具来处理字符表示形式和文本格式设置属性。任何文本都可以视为具有特定表示结构的字符序列。文本外观包括布局(和段落)和字体设置。但是,尽管在大多数情况下,文本布局保持不变,但是在不同的区域设置中运行报表时,字体设置可能会更改。

我们知道,就特定的字符表示而言,不同的语言需要不同的字符集。因此,使用文本意味着使用字体。但是, “报告字体”一章中提供了有关如何在JasperReports中使用字体的详细讨论。

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

字符编码

字符是传达有意义信息的最小书写单位。这是一个抽象的概念,字符没有视觉外观。 “大写拉丁字母A”是“小写拉丁语”,并从不同的字符“西里尔大写字母A”和“大写的希腊阿尔法”。

字符的视觉表示称为字形。一组特定的标志符号称为字体。 “大写拉丁字母A”,“大写西里尔字母A”和“大写希腊字母Alpha”可能具有相同的字形,但它们是不同的字符。同时,“大写拉丁字母A”的字形在Times New Roman,Gill Sans和Poetica斜体斜体中看起来可能非常不同,但它们仍代表相同的字符。

可用字符集称为字符。给定字符在库中的位置(索引)称为其代码位置或代码点。用数字表示给定库中代码点的方法称为字符编码

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

统一码

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

建议使用UTF-8编码。它使用可变数量的八位字节表示不同的字符。

在JRXML文件中,编码属性是在标头中指定的。在报表编制时使用它来解码XML内容。例如,如果报告仅包含法语单词和诸如ç,é,â之类的字符,则ISO-8859-1(又名Latin-1)编码就足够了-


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

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

为了解决此类问题,我们可以使用称为net.sf.jasperreports.export的导出客户属性。字符.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位十六进制代码表示。例如,希腊字母Γ可以写为\ u0393。遇到这种表示法时,引擎会要求在字符集中使用适当的字符表示形式,并且只会打印出该特定字符。 JRXML的内容如下-





   
      
      
   
   
   
      
      
   

   
      
      
   
   
   
      
      
   
   
   
      <band height="782">
         
         <textfield>
            <reportelement x="0" y="50" width="200" height="60"></reportelement>
            
            <textelement>
               <font fontname="DejaVu Sans" size="14"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
         </textfield>
         
         <statictext>
            <reportelement x="210" y="50" width="340" height="60"></reportelement>
            <textelement></textelement>
            
            <text>
               
            </text>
         </statictext>
         
         <textfield>
            <reportelement x="0" y="120" width="200" height="60"></reportelement>
            
            <textelement>
               <font fontname="DejaVu Sans" size="14" isbold="true"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
                
         </textfield>
         
         <statictext>
            <reportelement x="210" y="120" width="340" height="60"></reportelement>
            <textelement></textelement>
            <text></text>
         </statictext>
         
         <textfield>
            <reportelement x="0" y="190" width="200" height="60"></reportelement>
            
            <textelement>
               <font fontname="DejaVu Sans" size="14" isitalic="true" isunderline="true"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
                
         </textfield>
         
         <statictext>
            <reportelement x="210" y="190" width="340" height="60"></reportelement>
            <textelement></textelement>
            <text></text>
         </statictext>
         
         <textfield>
            <reportelement x="0" y="260" width="200" height="60"></reportelement>
            
            <textelement>
               <font fontname="DejaVu Sans" size="14" isbold="true" isitalic="true" isunderline="true"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
                
         </textfield>
         
         <statictext>
            <reportelement x="210" y="260" width="340" height="60"></reportelement>
            <textelement></textelement>
            <text></text>
         </statictext>

         <textfield>
            <reportelement x="0" y="330" width="200" height="60"></reportelement>
            
            <textelement textalignment="Right">
               <font fontname="DejaVu Sans" size="22"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
                
         </textfield>
         
         <textfield>
            <reportelement x="210" y="330" width="340" height="60"></reportelement>
            
            <textelement textalignment="Right">
               <font fontname="DejaVu Sans" size="22"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
                
         </textfield>
      
      </band>
   
    

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

填充和生成报告的Java代码如下。让我们将此文件JasperUnicodeReportFill.java保存到C:\ tools \ jasperreports -5.0.1 \ test \ src \ com \ tutorialspoint目录。

package com.tutorialspoint;

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.tutorialspoint.JasperUnicodeReportFill (viewFullReport是默认目标)-

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-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.jrprint

compile:
   [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\classes

compilereportdesing:
   [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.tutorialspoint.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 SUCCESSFUL
Total time: 4 minutes 1 second

经过上述编译,JasperViewer窗口打开,如下图所示:

Jasper报告Unicode示例

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