Предварительный просмотр / экспорт экспортного отчета iReport не обрабатывает переводы UTF-8? - PullRequest
6 голосов
/ 15 сентября 2011

Я пытаюсь заставить мои отчеты работать с пакетом переводов. Неважно, что я пытаюсь, я не могу отобразить 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.

EDIT: Я думал, что маркеры порядка байтов могли быть проблемой, но это не так. Я создал базовый отчет, который показывает сбой в 4.0.2.

Вот комплект ресурсов:

Greek properties file

И вывод в iReport:

enter image description here

А вот отчет и файл properties , используемый для наблюдения этих результатов.

Информация о норме: Когда файлы свойств сохранены в кодировке ANSI, я могу получить все немецкие символы, включая ä и ß. Когда файлы свойств сохраняются как UTF-8, работают только символы ASCII.

Ответы [ 3 ]

9 голосов
/ 18 сентября 2011

Стефан, я знаю, что это не очень хорошее решение, но оно работает для вашего образца.

        <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>

UPDATE:
После добавления шрифта 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>
2 голосов
/ 17 августа 2012

Это ответ для другого разработчика, у которого также есть проблема с кодированием при создании отчетов ...

У меня была похожая проблема при создании отчетов, например, с французским языковым стандартом.Мои пакеты и файлы шаблонов хранятся в базе данных, что позволяет создавать новые шаблоны и локали без перекомпиляции проекта.НО все символы с акцентами, содержащиеся во французском пакете, печатаются неправильно.Итак, я:

  • Проверьте кодировку набора символов (для UTF-8 без спецификации)
  • Проверьте заголовок XML файла отчета .jrxml ()

Я думаю, что отчеты 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 часа исследований ...

1 голос
/ 16 сентября 2011

Убедитесь, что в ваших ресурсах нет маркера порядка байтов . Это нарушит jasperreports и не будет отображаться в IDE или текстовых редакторах.

...