Вывод предварительного просмотра/экспортера iReport не обрабатывает переводы UTF-8?

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

Вот набор ресурсов:

Файл свойств на греческом языке

И вывод в iReport:

введите здесь описание изображения

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

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


person Stefan Kendall    schedule 15.09.2011    source источник
comment
Это странно. Это происходит с метками в заголовке столбца или только с данными, которые вы получаете из БД?   -  person Costis Aivalis    schedule 15.09.2011
comment
Это происходит со всем статическим текстом. Я не извлекаю какой-либо текст из базы данных.   -  person Stefan Kendall    schedule 16.09.2011
comment
Может дело в ОС? Я годами без проблем использую iReport с греческими буквами UTF-8. Я бы переустановил.   -  person Costis Aivalis    schedule 16.09.2011
comment
У меня такая же проблема при работе на сервере. Я использую 4.0.2. Сбой в CentOS и Windows 7. Завтра я попытаюсь создать наименьший возможный сбой проекта, а затем, возможно, смогу прикрепить проект к вопросу, который иллюстрирует сбой базового случая.   -  person Stefan Kendall    schedule 16.09.2011
comment
Я не понимаю, почему вы упомянули шрифт. Это не имеет ничего общего с вашим выходным битовым шаблоном.   -  person tchrist    schedule 18.09.2011
comment
@tchrist: шрифт мог не поддерживать Unicode. Ариал делает.   -  person Stefan Kendall    schedule 18.09.2011


Ответы (3)


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

        <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>
person Alex K    schedule 18.09.2011
comment
Под кодовой страницей вы имеете в виду кодировку файлов свойств? Они должны быть UTF-8, но я думаю, что могу проверить три раза. На данный момент хорошие решения не являются проблемой. Мне просто нужны решения, лол. Я попробую этот метод независимо от понедельника. - person Stefan Kendall; 18.09.2011
comment
@Stefan Я проверяю ваш файл свойств - мой редактор (Notepad ++) определяет кодовую страницу, такую ​​​​как ANSI, как UTF-8 (== UTF-8 без спецификации, метки порядка байтов). Я пробовал конвертировать из CP-1252 в UTF-8, и это работает. - person Alex K; 18.09.2011
comment
Я пробовал это же преобразование, и оно все еще терпит неудачу. Файл действителен в кодировке UTF-8, поэтому я не понимаю, зачем в любом случае нужно преобразование. - person Stefan Kendall; 19.09.2011
comment
Неверный текст, без исключений. Я получаю больше искаженного текста, просто не то, что я написал выше. - person Stefan Kendall; 19.09.2011
comment
@Стефан. Попробуйте это: новая строка ($ R {title}.getBytes (ISO-8859-1), UTF-8) - person Alex K; 19.09.2011
comment
Ну, это работает для греческого, немецкого и пары других простых языков, но не работает на японском, китайском и корейском. Файлы свойств выглядят не в кодировке UTF-8, так зачем же нужен этот синтаксический анализ? - person Stefan Kendall; 19.09.2011
comment
Я думаю, что для ответа на ваш вопрос необходима отладка JR. Возможно, это ошибка исходного кода - той части, которая считывает данные из файла свойств. - person Alex K; 19.09.2011
comment
На самом деле, похоже, что это работает для веб-вывода для корейского и японского языков, но вывод PDF не работает даже при включенном встраивании PDF. - person Stefan Kendall; 19.09.2011
comment
@Stefan А как насчет внутреннего средства просмотра iReport? - person Alex K; 19.09.2011
comment
Внутреннее средство просмотра iReport просто показывает квадраты. Всякий раз, когда я пытаюсь экспортировать в PDF, я получаю следующее: Ошибка экспорта печати... Не удалось загрузить следующий шрифт: pdfFontName: Times-Roman pdfEncoding: Identity-H isPdfEmbedded: true net.sf.jasperreports.engine.JRRuntimeException: не удалось загрузите следующий шрифт: pdfFontName: Times-Roman pdfEncoding: Identity-H isPdfEmbedded: true - person Stefan Kendall; 19.09.2011
comment
Я добавил шрифт Arial для своего iReport через Tools-Options-iReport-Fonts. ‹font fontName=Arial pdfEncoding=Identity-H isPdfEmbedded=true/› - person Alex K; 19.09.2011
comment
Могу ли я увидеть вашу конфигурацию для этого? Я добавил шрифт, но получаю ту же ошибку для Arial. - person Stefan Kendall; 19.09.2011
comment
Тем не менее, это приводит меня к HTML и XLS, что лучше, чем раньше. Эта проблема с PDF, вероятно, вообще отдельная тема. - person Stefan Kendall; 19.09.2011
comment
@Stefan Я обновил свой ответ - добавил информацию о шрифте и обновил объявление шрифта для текстового элемента. - person Alex K; 19.09.2011
comment
@Stefan Я добавил ссылку на ресурс msdn с информацией о шрифтах: msdn.microsoft.com /en-us/goglobal/bb688134. Цитата из статьи: Основные шрифты Windows (Times New Roman, Courier New, Arial, Microsoft Sans Serif и Tahoma) содержат латиницу, иврит, арабский, греческий и кириллицу, но не содержат восточноазиатских символов. Еще одна полезная ссылка: alanwood.net/unicode/fonts-east-asian.html< /а> - person Alex K; 21.09.2011
comment
Ах, конечно! Ты действительно заслужил эту награду. Спасибо за это. - person Stefan Kendall; 22.09.2011

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

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

  • Проверьте кодировку символов пакета (установите 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 часа исследований...

person Sébastien Vanmechelen    schedule 17.08.2012
comment
Для меня этого было достаточно, как сказал Себастьян Ванмехелен: InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(myBundle), Charset.forName("UTF-8")); ResourceBundle bundle = new PropertyResourceBundle(reader); Мой файл свойств имеет кодировку UTF-8 без BOM (используйте notepad++), чтобы не было проблем с фильтрацией Maven (для этого нужны файлы UTF-8). - person martins.tuga; 20.02.2013

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

person Stefan Kendall    schedule 16.09.2011