当前位置: 首页 > 教程 > JasperReports >

JasperReports Unicode支持

精华
小牛编辑
157浏览
2023-03-14

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

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

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

JasperReports 字符编码

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

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

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

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

JasperReports Unicode

Unicode 是一种字符集,其中包含世界语言中使用的大多数字符。它可以容纳数百万个字符,并且已经包含了数十万个字符。Unicode 被分成 64K 个字符的“planes”。大多数情况下唯一使用的是第一个plane,称为基本多语言plane或 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的示例

为了演示在 Jasperreports 中使用 unicode 支持,让我们编写新的报表模板 (jasper_report_template.jrxml)。在这里,我们将使用 Unicode 字符 (\uXXXX) 显示不同语言的文本。任何使用 UTF-8 编码的字符都可以仅使用其 4 位十六进制代码来表示。例如,希腊字母Γ可以写成\u0393。当遇到这样的符号时,引擎会在字符集中调用适当的字符表示,并且只会打印出那个特定的字符。

<?xml version = "1.0" encoding = "UTF-8"?>

<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
   http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
   name = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "GreekText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
         "\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
         "\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
         "\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
         "\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
      </defaultValueExpression>
   </parameter>

   <parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
         "\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
         "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
         "\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
      </defaultValueExpression>
   </parameter>
   
   <title>
      <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>
   </title>
	
</jasperReport>

先编译jrxml文件为Jasper文件

package cn.xnip;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class JasperReportCompile {

    public static void main(String[] args) {
        String filePath = "D:/idea_codes/jasper_reports/jasper_report_template.jrxml";
        try {
            JasperCompileManager.compileReportToFile(filePath,"d:/jasper_report_template.jasper");
            System.out.println("编译成功");
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
}

编译后在D:/盘根目录下生成jasper_report_template.jasper文件,然后再填充数据:

package cn.xnip;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class JasperReportFill {

   public static void main(String[] args) {
      String sourceFileName = "d:/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
              new JRBeanCollectionDataSource(dataList);
      try {
         JasperFillManager.fillReportToFile(
                 sourceFileName, null, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

填充数据完毕后,在D:/盘根目录下生成jasper_report_template.jrprint文件,最后使用预览程序预览:

package cn.xnip;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.view.JasperViewer;

public class JasperReportView {
    public static void main(String[] args) {
        String filePath = "D:/jasper_report_template.jrprint";
        try {
            JasperViewer.viewReport(filePath,false);
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
}

最后输出结果如下:

在这里,我们可以看到显示的文本是不同的语言。此外,我们看到语言在同一页面上组合在一起,并混合到相同的文本元素中。