Jasper-reports-jasper-unicode-support
Unicodeのサポート
JasperReportsでは、テキストの操作には、文字表現とテキストフォーマットプロパティの両方を処理するための専用ツールが必要です。 任意のテキストは、特定の表現構造を持つ文字シーケンスと見なすことができます。 テキストの外観は、レイアウト(および段落)とフォント設定の両方で構成されます。 ただし、ほとんどの場合、テキストレイアウトは不変のままですが、異なるロケールでレポートを実行するとフォント設定が変更される場合があります。
特定の文字表現に関しては、言語ごとに異なる文字セットが必要であることがわかっています。 したがって、テキストの操作はフォントの操作を意味します。 ただし、JasperReportsでフォントを使用する方法の詳細については、章のリンク:/jasper_reports/jasper_report_fonts [Report Fonts]を参照してください。
特定のレポートのテキストコンテンツに関する主な機能の1つは、レポートを国際化できることです。 つまり、異なる言語や他のローカライズ設定を使用して、ハードコーディングされた変更なしに、異なるローカライズ環境でレポートを実行できます。 レポートを国際化する場合、文字エンコードは重要な機能です。
文字コード
キャラクターは、意味のある情報を伝える文章の最小単位です。 それは抽象的な概念であり、キャラクターには視覚的な外観はありません。 「大文字ラテンA」は、「小文字ラテンa」および「大文字キリル文字A」および「大文字ギリシャ文字」とは異なる文字です。
文字の視覚的表現は glyph として知られています。 特定のグリフのセットは font と呼ばれます。 「ラテン文字Aの大文字」、「キリル文字Aの大文字」、および「ギリシャ文字の大文字」には、同一のグリフが含まれている場合がありますが、それらは異なる文字です。 同時に、「大文字のラテンA」のグリフは、Times New Roman、Gill Sans、およびPoeticaのイタリック体で大きく異なるように見えますが、それでも同じ文字を表しています。
使用可能な文字のセットは、_文字レパートリー_と呼ばれます。 レパートリー内の特定の文字の位置(インデックス)は、コード位置またはコードポイントとして知られています。 特定のレパートリー内のコードポイントを数値で表す方法は、「文字エンコーディング」と呼ばれます。
エンコーディングは通常、オクテットで表現されます。 オクテットは、8つの2進数、つまり8つの1と0のグループです。 オクテットは、16進表記を使用するために、0〜255、または0x00〜0xFFの数値範囲を表すことができます。
Unicode
Unicodeは、世界の言語で使用されるほとんどの文字を含む文字レパートリーです。 数百万の文字を収容でき、すでに数十万を含んでいます。 Unicodeは64K文字の「プレーン」に分割されます。 ほとんどの状況で使用される唯一のものは、基本的な多言語飛行機、またはBMPとして知られる最初の飛行機です。
UTF-8が推奨されるエンコードです。 可変文字数のオクテットを使用して、異なる文字を表します。
JRXMLファイルでは、エンコード属性はヘッダーで指定されます。 レポートのコンパイル時に、XMLコンテンツをデコードするために使用されます。 たとえば、レポートにフランス語の単語と、ç、é、âなどの文字のみが含まれている場合、ISO-8859-1(a.k.a Latin-1)エンコーディングで十分です-
<?xml version = "1.0" encoding = "ISO-8859-1"?>
上記のように、理想的には、ドキュメント内のすべての文字を正しく表すことができる最小の文字セットに適合するエンコードを選択できます。 ただし、多言語ドキュメントの場合(つまり、 複数の言語で綴られた単語を含むドキュメント)、最小の文字セットに適合したエンコードを選択する必要があります。異なる言語に属している場合でも、ドキュメント内のすべての文字を正しく表すことができます。 多言語ドキュメントを処理できる文字エンコーディングの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桁の16進コードのみを使用して表現できます。 たとえば、ギリシャ文字Γは\ 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 \ finddevguidesディレクトリに保存しましょう。
package com.finddevguides;
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_のインスタンスを使用して、1つのレコードを含むデータソースをシミュレートしますが、この単一のレコードのすべてのフィールドは_null_です。
レポート生成
通常のANTビルドプロセスを使用して、上記のファイルをコンパイルおよび実行します。 ファイルbuild.xmlの内容(ディレクトリC:\ tools \ jasperreports-5.0.1 \ testに保存)は以下のとおりです。
インポートファイル-baseBuild.xmlは、チャプターリンク:/jasper_reports/jasper_environment_setup [Environment Setup]から選択され、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.finddevguides.JasperUnicodeReportFill (viewFullReportがデフォルトのターゲットです)を実行します-
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.finddevguides.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/faql#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.finddevguides.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ウィンドウが開き、以下の画面に表示されます-
ここでは、表示されているテキストが異なる言語であることがわかります。 また、同じページで言語がグループ化され、同じテキスト要素に混在していることもわかります。