รองรับ 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 จะเปิดขึ้นตามที่แสดงในหน้าจอด้านล่าง -
ที่นี่เราจะเห็นว่าข้อความที่แสดงเป็นภาษาต่างๆ นอกจากนี้เรายังเห็นว่าภาษาต่างๆถูกจัดกลุ่มเข้าด้วยกันในหน้าเดียวกันและผสมเป็นองค์ประกอบข้อความเดียวกัน