Поддержка Unicode
В JasperReports для работы с текстами требуются специальные инструменты для обработки как представления символов, так и свойств форматирования текста. Любой текст можно рассматривать как последовательность символов с определенной структурой представления. Внешний вид текста определяется как макетом (и абзацем), так и настройками шрифта. Но хотя в большинстве случаев макет текста остается неизменным, настройки шрифта могут измениться при запуске отчета в разных языковых стандартах.
Мы знаем, что разные языки нуждаются в разных наборах символов относительно представления конкретных символов. Поэтому работать с текстами - значит работать со шрифтами. Однако подробное обсуждение того, как использовать шрифты в JasperReports, доступно в главе « Шрифты отчета» .
Одной из основных характеристик текстового содержимого в данном отчете является возможность его интернационализации. Это означает, что мы можем запускать отчет в разных локализованных средах, используя разные языки и другие настройки локализации без каких-либо жестко заданных изменений. Кодировка символов - важная функция, когда отчет предназначен для интернационализации.
Кодировка символов
Символ - это наименьшая единица письма, передающая значимую информацию. Это абстрактное понятие, персонаж не имеет визуального облика. «Прописная латиница A» - это символ, отличный от «строчной латинской буквы a», «прописной кириллицы A» и «прописной греческой буквы».
Визуальное представление персонажа известно как glyph. Определенный набор глифов называетсяfont. «Прописная латиница A», «прописная кириллица A» и «прописная греческая альфа» могут иметь одинаковые глифы, но это разные символы. В то же время глифы для «заглавной латинской буквы А» могут выглядеть очень по-разному в курсиве Times New Roman, Gill Sans и Poetica, но они все равно представляют один и тот же символ.
Набор доступных персонажей называется репертуаром персонажей . Местоположение (индекс) данного символа в репертуаре называется его кодовой позицией или кодовой точкой. Метод численного представления кодовой точки в заданном репертуаре называетсяcharacter encoding.
Кодировки обычно выражаются в октетах. Октет - это группа из восьми двоичных цифр, т. Е. Восьми единиц и нулей. Октет может выражать числовой диапазон от 0 до 255 или от 0x00 до 0xFF, чтобы использовать шестнадцатеричную нотацию.
Unicode
Юникод - это набор символов, который содержит большинство символов, используемых в языках мира. Он может вместить миллионы символов и уже содержит сотни тысяч. Юникод разделен на «плоскости» по 64К символов. В большинстве случаев используется только первый самолет, известный как базовый многоязычный самолет, или 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.
пример
Чтобы продемонстрировать использование поддержки Unicode в Jasperreports, давайте напишем новый шаблон отчета (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testкаталог. Здесь мы будем отображать текст на разных языках, используя символы Юникода (\ uXXXX). Любой символ, закодированный с помощью UTF-8, может быть представлен только его 4-значным шестнадцатеричным кодом. Например, греческая буква Γ может быть записана как \ u0393. Когда встречается такая нотация, механизм вызывает соответствующее представление символа в наборе символов, и только этот конкретный символ будет распечатан. Содержимое JRXML показано ниже -
<?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>
В приведенном выше файле мы видим наличие кодировки 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 при заполнении отчетов для имитации источника данных с одной записью в нем, но со всеми полями в этой единственной записи равными нулю .
Генерация отчетов
Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.
Файл импорта - baseBuild.xml выбирается из главы « Настройка среды» и должен быть помещен в тот же каталог, что и build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the report
stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Затем давайте откроем окно командной строки и перейдем в каталог, в котором находится 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, как показано на экране, приведенном ниже -
Здесь мы видим, что отображаемый текст на разных языках. Также мы видим, что языки сгруппированы вместе на одной странице, а также смешаны в одном текстовом элементе.