我正在尝试使用翻译包来处理我的报告。无论我尝试什么,我似乎无法为任何语言呈现UTF-8 - 我只为每个UTF-8字符获得两个破碎的字符。
我的报告以此开头:<?xml version="1.0" encoding="UTF-8"?>
...但是iReport预览不起作用,
我的实际代码有:
JRProperties.setProperty("net.sf.jasperreports.default.pdf.encoding", "UTF-8");
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8")
似乎都无法输出UTF-8。这可能会发生什么?我把头发拉了出来。即使字体设置为Arial
,我也遇到了问题。我的网络应用程序使用与Grails相同的字体和类似的捆绑包,我没有任何问题,因此发生了特定于jasperreports的事情。
修改: 我认为字节顺序标记可能是问题,但事实并非如此。我创建了一个基本报告,显示4.0.2中的失败。
这是资源包:
iReport中的输出:
以下是用于观察这些结果的report和properties文件。
Nore信息: 当属性文件以ANSI编码保存时,我可以获得所有德语字符,包括ä和ß。当属性文件保存为UTF-8时,只有ASCII字符可用。
答案 0 :(得分:9)
Stefan,我知道这不是一个很好的解决方案,但它适用于你的样品。
<textField>
<reportElement x="49" y="0" width="359" height="38"/>
<textElement>
<font fontName="Arial" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[new String($R{title}.getBytes("ISO-8859-1"), "UTF-8")]]></textFieldExpression>
</textField>
如果你知道源代码页,转换会对你有帮助。可以是你可以在报告中传递代码页并将其用作表达式中的参数或变量。
表达式可以是这样的:
<textFieldExpression><![CDATA[new String($R{title}.getBytes($P{codePage}), "UTF-8")]]></textFieldExpression>
或者像这样,如果您可以在属性文件的标题中传递代码页:
<textFieldExpression><![CDATA[new String($R{title}.getBytes($R{codePage}), "UTF-8")]]></textFieldExpression>
<强>更新强>
添加Arial字体后,我的irfonts.xml(%IREPORT_DIR%\ ireport \ fonts)具有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="Arial">
<normal><![CDATA[arial.ttf]]></normal>
<bold><![CDATA[arialbd.ttf]]></bold>
<italic><![CDATA[ariali.ttf]]></italic>
<boldItalic><![CDATA[arialbi.ttf]]></boldItalic>
<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
<pdfEmbedded><![CDATA[false]]></pdfEmbedded>
</fontFamily>
</fontFamilies>
答案 1 :(得分:2)
对于在生成报告时也存在编码问题的其他开发人员,这是一个答案......
在使用法语区域设置生成报告时遇到了类似的问题。 我的捆绑包和模板文件存储在数据库中,以允许新模板和区域设置,而无需重新编译项目。 但是法语包中包含重音符号的每个字符都不能正确打印。 所以,我:
我认为jasper报告默认使用UTF-8生成报告,但我不确定100%。 它可以强制使用:
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
问题再次存在,而不是:
ResourceBundle bundle = new PropertyResourceBundle(new ByteArrayInputStream(myBundle)); // myBundle is a byte array retrieve from a DB
我这样做:
InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(myBundle), Charset.forName("UTF-8"));
ResourceBundle bundle = new PropertyResourceBundle(reader);
之后,只需将资源包传递给JasperFillManager,现在一切顺利。 可能是这么简单,但它可以节省我2或3个小时的研究......
答案 2 :(得分:1)
确保您的资源包没有byte order marker。这将打破jasperreports,它不会出现在IDE或文本编辑器中。