iReport预览/导出器输出不处理UTF-8翻译?

iReport预览/导出器输出不处理UTF-8翻译?,utf-8,internationalization,jasper-reports,ireport,Utf 8,Internationalization,Jasper Reports,Ireport,我正试图使我的报告与翻译包一起工作。不管我怎么做,我似乎无法为任何语言呈现UTF-8,我只是为每个UTF-8字符获得两个断字符 我的报告以以下内容开头: …但iReport预览不起作用 我的实际代码是这样的: JRProperties.setProperty("net.sf.jasperreports.default.pdf.encoding", "UTF-8"); exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UT

我正试图使我的报告与翻译包一起工作。不管我怎么做,我似乎无法为任何语言呈现UTF-8,我只是为每个UTF-8字符获得两个断字符

我的报告以以下内容开头:
…但iReport预览不起作用

我的实际代码是这样的:

JRProperties.setProperty("net.sf.jasperreports.default.pdf.encoding", "UTF-8");
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8")
两者似乎都无法输出UTF-8。这里可能发生了什么?我在拔头发。即使字体设置为
Arial
,我也有问题。我的web应用程序使用与Grails相同的字体和类似的捆绑包,我在这方面没有问题,因此jasperreports特有的情况正在发生

编辑: 我认为字节顺序标记可能是问题所在,但事实并非如此。我创建了一个基本报告,显示了4.0.2中的失败

以下是资源包:

以及iReport中的输出:

这是用来观察这些结果的文件

挪威信息:
当属性文件以ANSI编码保存时,我可以获得所有德语字符,包括ä和ß。当属性文件保存为UTF-8时,只有ASCII字符有效。

请确保您的资源包没有可用的字符。这将破坏jasperreports,并且它不会显示在IDE或文本编辑器中。

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字体后,my irfonts.xml(%IREPORT\u 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>

这是其他开发人员的答案,他们在生成报告时也有编码问题

例如,在使用法语区域设置生成报告时,我遇到了类似的问题。 我的bundle和templates文件存储在一个数据库中,允许在不重新编译项目的情况下使用新的模板和区域设置。 但是法语包中包含的每个带有口音的字符都无法正确打印。 因此,我:

  • 检查捆绑字符编码(设置为UTF-8,无BOM)
  • 检查.jrxml报告文件()的XML头
我认为jasper reports默认使用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个小时的研究时间……

这太奇怪了。这种情况是发生在列标题中的标签上,还是仅发生在从数据库获取的数据上?所有静态文本都会发生这种情况。我没有从数据库中提取任何文本。这可能是操作系统的问题吗?多年来,我一直在使用带有希腊UTF-8字母的iReport,没有任何问题。我会重新安装它。在服务器上运行时也会遇到同样的问题。我用的是4.0.2。在CentOS和Windows 7上失败。明天我将尝试创建最小可能的项目失败,然后也许我可以将一个项目附加到说明基本案例失败的问题上。我不明白你为什么提到字体。这与输出位模式无关。所谓代码页,是指属性文件的编码吗?它们应该是UTF-8,但我想我可以再检查三次。在这一点上,“好”的解决方案不是问题。我只需要解决方案,lol。不管周一如何,我都会尝试这种方法。@Stefan我检查了你的属性文件-我的编辑器(记事本++)检测到类似“ANSI为UTF-8”(==UTF-8,没有BOM,字节顺序标记)。我尝试了从CP-1252到UTF-8的转换,它工作了。我尝试了同样的转换,但仍然失败。文件是有效的UTF-8,所以我不明白为什么需要转换。错误的文本,没有例外。我得到了更多的乱码文本,只是不是我上面发布的内容。@Stefan我已经添加了指向msdn资源的链接,其中包含有关字体的信息:。文章引用:Windows核心字体(Times New Roman、Courier New、Arial、Microsoft Sans Serif和Tahoma)包含拉丁语、希伯来语、阿拉伯语、希腊语和西里尔语脚本,但不包含东亚脚本字符。另一个有用的链接:对我来说,正如Sébastien Vanmechelen所说的那样:
InputStreamReader=newInputStreamReader(newbytearrayinputstream(myBundle),Charset.forName(“UTF-8”);ResourceBundle=新属性ResourceBundle(读卡器)我的属性文件是UTF-8,没有BOM表(使用记事本++),编码为不存在Maven过滤问题(它需要UTF-8文件)。