Unicodeサポート

JasperReportsでは、テキストを操作するには、文字表現とテキストフォーマットプロパティの両方を処理するための専用ツールが必要です。すべてのテキストは、特定の表現構造を持つ文字シーケンスと見なすことができます。テキストの外観は、レイアウト(および段落)とフォント設定の両方で構成されます。ただし、ほとんどの場合、テキストレイアウトは不変のままですが、異なるロケールでレポートを実行すると、フォント設定が変更される場合があります。

言語が異なれば、特定の文字表現に関して異なる文字セットが必要になることはわかっています。したがって、テキストを操作するということは、フォントを操作することを意味します。ただし、JasperReportsでフォントを使用する方法の詳細については、「レポートフォント」の章を参照してください。

特定のレポートのテキストコンテンツに関する主な機能の1つは、それを国際化する可能性です。つまり、ハードコードされた変更を行うことなく、さまざまな言語やその他のローカリゼーション設定を使用して、さまざまなローカライズ環境でレポートを実行できます。レポートを国際化する場合、文字エンコードは重要な機能です。

文字コード

文字は、意味のある情報を伝える書き込みの最小単位です。それは抽象的な概念であり、キャラクターは視覚的な外観を持っていません。「大文字のラテン語A」は、「小文字のラテン語a」、「大文字のキリル語A」、「大文字のギリシャ文字アルファ」とは異なる文字です。

キャラクターの視覚的表現は、 glyph。グリフの特定のセットは、font。「UppercaseLatinA」、「uppercase Cyrillic A」、「uppercase Greek Alpha」のグリフは同じかもしれませんが、文字が異なります。同時に、「大文字のラテンA」のグリフは、Times New Roman、Gill Sans、Poeticaの大法官府のイタリック体では大きく異なる場合がありますが、それでも同じ文字を表します。

使用可能な文字のセットは、文字レパートリーと呼ばれます。レパートリー内の特定の文字の位置(インデックス)は、そのコード位置またはコードポイントと呼ばれます。与えられたレパートリー内のコードポイントを数値的に表す方法は、character encoding

エンコーディングは通常、オクテットで表されます。オクテットは、8つの2進数、つまり8つの1と0のグループです。オクテットは、16進表記を使用するために、0〜255、または0x00〜0xFFの数値範囲を表すことができます。

Unicode

Unicodeは、世界の言語で使用されているほとんどの文字を含む文字レパートリーです。数百万の文字を収容でき、すでに数十万の文字が含まれています。Unicodeは、64K文字の「平面」に分割されます。ほとんどの状況で使用されるのは、基本的な多言語平面(BMP)として知られる最初の平面だけです。

UTF-8が推奨されるエンコーディングです。可変数のオクテットを使用して、さまざまな文字を表します。

JRXMLファイルでは、encoding属性はヘッダーで指定されます。これは、レポートのコンパイル時にXMLコンテンツをデコードするために使用されます。たとえば、レポートにフランス語の単語のみとç、é、âなどの文字が含まれている場合、ISO-8859-1(別名Latin-1)エンコーディングで十分です。

<?xml version = "1.0" encoding = "ISO-8859-1"?>

上で見たように、理想的には、ドキュメント内のすべての文字を正しく表すことができる最小の文字セットに適合するエンコーディングを選択できます。ただし、多言語ドキュメント(つまり、複数の言語で綴られた単語を含むドキュメント)の場合は、異なる言語に属していても、ドキュメント内のすべての文字を正しく表すことができる、最小限の文字セットに適合したエンコーディングを選択する必要があります。多言語ドキュメントを処理できる文字エンコードの1つは、UTF-8、JasperReportsによってデフォルトのエンコーディング値として使用されます。

テキストは通常​​、国際化中にドキュメント内ではなく、リソースバンドルファイルに保存されます。そのため、JRXML自体が完全にASCII互換に見える場合がありますが、実行時に生成されるレポートには、ASCIIで読み取れないテキストが含まれています。その結果、特定の種類のドキュメントエクスポート形式(CSV、HTML、XHTML、XML、テキストなど)の場合、生成されたドキュメントのエンコーディングも知っている必要があります。さまざまな言語がさまざまな文字エンコードでサポートされています。そのため、毎回、ローカライズされた環境でレポートを実行する必要があります。さらに、生成されたドキュメント言語に最も適切な文字エンコードはどれかを知る必要があります。この場合、JRXMLファイル自体で定義されているencodingプロパティは役に立たなくなる可能性があります。

この種の問題を解決するために、net.sf.jasperreports.export.character.encodingとして知られるエクスポート顧客プロパティを使用できます。このエクスポートカスタムプロパティはデフォルトでUTF-8に設定されており、JasperReportsに存在します。

このデフォルト値は、default.jasperreports.propertiesファイルで設定されます。エクスポート時のより具体的なオプションについては、CHARACTER_ENCODINGエクスポートパラメーターも使用できます。

JasperreportsでのUnicodeサポートの使用を示すために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 Save it to 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 \ 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のインスタンスを使用して、1つのレコードを含むデータソースをシミュレートしますが、この1つのレコードのすべてのフィールドはnullです。

レポートの生成

通常のANTビルドプロセスを使用して、上記のファイルをコンパイルして実行します。ファイルbuild.xml(ディレクトリC:\ tools \ jasperreports-5.0.1 \ testの下に保存)の内容は次のとおりです。

インポートファイル--baseBuild.xmlは、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.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ウィンドウが開きます-

ここでは、表示されているテキストがさまざまな言語であることがわかります。また、言語が同じページにグループ化され、同じテキスト要素に混在していることもわかります。