รองรับ Unicode

ใน JasperReports การทำงานกับข้อความจำเป็นต้องมีเครื่องมือเฉพาะเพื่อประมวลผลทั้งการแสดงอักขระและคุณสมบัติการจัดรูปแบบข้อความ ข้อความใด ๆ ถือได้ว่าเป็นลำดับอักขระที่มีโครงสร้างการแสดงเฉพาะ ลักษณะข้อความประกอบด้วยทั้งการจัดวาง (และย่อหน้า) และการตั้งค่าแบบอักษร แต่ในกรณีส่วนใหญ่เค้าโครงข้อความยังคงไม่เปลี่ยนแปลงการตั้งค่าแบบอักษรอาจเปลี่ยนแปลงเมื่อเรียกใช้รายงานในสถานที่ต่างๆ

เรารู้ว่าภาษาที่แตกต่างกันต้องการชุดอักขระที่แตกต่างกันสำหรับการแสดงอักขระเฉพาะ ดังนั้นการทำงานกับข้อความจึงหมายถึงการทำงานกับฟอนต์ อย่างไรก็ตามการอภิปรายรายละเอียดเกี่ยวกับวิธีการใช้แบบอักษรใน JasperReports มีอยู่ในบทรายงานแบบอักษร

คุณสมบัติหลักประการหนึ่งที่เกี่ยวข้องกับเนื้อหาข้อความในรายงานหนึ่ง ๆ คือความเป็นไปได้ที่จะทำให้เป็นสากล หมายความว่าเราสามารถเรียกใช้รายงานในสภาพแวดล้อมที่แปลเป็นภาษาต่างๆโดยใช้ภาษาที่แตกต่างกันและการตั้งค่าการแปลอื่น ๆ โดยไม่ต้องแก้ไขฮาร์ดโค้ด การเข้ารหัสอักขระเป็นคุณลักษณะที่สำคัญเมื่อรายงานมีวัตถุประสงค์เพื่อให้เป็นสากล

การเข้ารหัสอักขระ

อักขระเป็นหน่วยที่เล็กที่สุดของการเขียนที่ถ่ายทอดข้อมูลที่มีความหมาย มันเป็นแนวคิดนามธรรมตัวละครไม่มีรูปลักษณ์ "ตัวพิมพ์ใหญ่ละติน A" เป็นอักขระที่แตกต่างจาก "ตัวพิมพ์เล็กละติน a" และจาก "ตัวพิมพ์ใหญ่ซิริลลิก A" และ "อักษรกรีกอัลฟาตัวพิมพ์ใหญ่"

การแสดงภาพของตัวละครเรียกว่า a glyph. ร่ายมนตร์ชุดหนึ่งเรียกว่า afont. "ตัวพิมพ์ใหญ่ละติน A" "ตัวพิมพ์ใหญ่ซิริลลิก A" และ "อักษรกรีกอัลฟ่าตัวพิมพ์ใหญ่" อาจมีร่ายมนตร์เหมือนกัน แต่เป็นอักขระที่แตกต่างกัน ในขณะเดียวกันร่ายมนตร์สำหรับ "ละตินตัวพิมพ์ใหญ่" อาจดูแตกต่างกันมากในตัวเอียง Times New Roman, Gill Sans และ Poetica chancery แต่ก็ยังแสดงถึงอักขระเดียวกัน

ชุดของตัวอักษรที่มีเรียกว่าละครตัวละคร ตำแหน่ง (ดัชนี) ของอักขระที่กำหนดภายในละครเรียกว่าตำแหน่งรหัสหรือจุดรหัส วิธีการแสดงจุดรหัสเป็นตัวเลขภายในละครที่กำหนดเรียกว่าcharacter encoding.

โดยปกติการเข้ารหัสจะแสดงในรูปของอ็อกเต็ต ออคเต็ตคือกลุ่มของเลขฐานสองแปดหลัก ได้แก่ เลขแปดและเลขศูนย์ ออคเต็ตสามารถแสดงช่วงตัวเลขระหว่าง 0 ถึง 255 หรือระหว่าง 0x00 ถึง 0xFF เพื่อใช้สัญกรณ์ฐานสิบหก

Unicode

Unicode เป็นรายการอักขระที่มีอักขระส่วนใหญ่ที่ใช้ในภาษาของโลก สามารถรองรับอักขระได้หลายล้านตัวและมีหลายแสนตัวแล้ว Unicode แบ่งออกเป็น "เครื่องบิน" ที่มีอักขระ 64K เครื่องบินลำเดียวที่ใช้ในสถานการณ์ส่วนใหญ่คือเครื่องบินลำแรกซึ่งเรียกว่าเครื่องบินหลายภาษาพื้นฐานหรือ BMP

UTF-8 คือการเข้ารหัสที่แนะนำ ใช้จำนวนอ็อกเต็ตตัวแปรเพื่อแทนอักขระต่างๆ

ในไฟล์ JRXML แอตทริบิวต์การเข้ารหัสถูกระบุไว้ในส่วนหัว ใช้ในเวลารวบรวมรายงานเพื่อถอดรหัสเนื้อหา XML ตัวอย่างเช่นหากรายงานมีเฉพาะคำภาษาฝรั่งเศสและอักขระเช่นç, é, âดังนั้นการเข้ารหัส ISO-8859-1 (aka 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ไดเรกทอรี ในที่นี้เราจะแสดงข้อความในภาษาต่างๆโดยใช้อักขระ Unicode (\ 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เมื่อกรอกรายงานเพื่อจำลองแหล่งข้อมูลที่มีระเบียนหนึ่งในนั้น แต่มีสาขาทั้งหมดในบันทึกนี้เป็นโสด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 จะเปิดขึ้นตามที่แสดงในหน้าจอด้านล่าง -

ที่นี่เราจะเห็นว่าข้อความที่แสดงเป็นภาษาต่างๆ นอกจากนี้เรายังเห็นว่าภาษาต่างๆถูกจัดกลุ่มเข้าด้วยกันในหน้าเดียวกันและผสมเป็นองค์ประกอบข้อความเดียวกัน