JasperReports Unicode支持
在 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();
}
}
}
最后输出结果如下:
在这里,我们可以看到显示的文本是不同的语言。此外,我们看到语言在同一页面上组合在一起,并混合到相同的文本元素中。