2010-12-14 2 views
1

Не могли бы вы помочь мне интерпретировать греческие символы с отображением HTML как HTML = & # 8062; и значение Hex 01F7EИнтерпретация греческих символов FOP

Детали этих символов можно найти на ниже URL

http://www.isthisthingon.org/unicode/index.php?page=01&subpage=F&hilite=01F7E

Когда я запускаю этот символ в Apache FOP, они дают мне ArrayIndexOut из Bounds Exception

Вызванный by: java.lang.ArrayIndexOutOfBoundsException: -1 at org.apache.fop.text.linebreak.LineBreakUtils.getLineBreakPairProperty (LineBreakUtils.java:668) at org.apache.fop.text.linebreak.LineBreakStatus.nextChar (LineBreakStatus. java: 117)

Когда я заглянул в код FOP, я не смог понять необходимость создания lineBreakProperties [] [] в LineBreakUtils.java.

Я также заметил, что FOP не выполняется для всех греческих символов, упомянутых на приведенной выше странице, которые не могут быть отображены с аналогичной ошибкой.

Что это за особые символы?
Почему их отсутствие для этих символов не является этими перерывами или TAB?
Кто-нибудь решил аналогичную проблему с FOP?

ответ

0

Ответ от Apache

На первый взгляд, это кажется незначительным надзоре в реализации Unicode linebreaking в ФОП. Это не учитывает возможность того, что заданный код не присваивается «классу» в контексте строки. (= U + 1F7E не появляется в файле http://www.unicode.org/Public/UNIDATA/LineBreak.txt, который используется в качестве основы для создания этих массивов в LineBreakUtils.java)

С другой стороны, можно было бы, очевидно, поднять вопрос, почему вы так отчаянно нуждаются чтобы на вашем выходе был присвоен неназначенный код. Вы абсолютно уверены, что вам это нужно? Если да, то можете ли вы уточнить точную причину? (т. е. какой именно этот неназначенный код используется?)

Самый простой 'исправить', кажется, примерно следующим образом:

индекс: SRC/Java/орг/Apache/фат/текст/перевод строки/LineBreakStatus.java

--- SRC/java/org/apache/fop/text/linebreak/LineBreakStatus.java (редакция 1054383) +++ src/java/org/apache/fop/text/linebreak/LineBreakStatus.java (рабочий ) @@ - 87,6 +87,7 @@

 /* Initial conversions */ 
    switch (currentClass) { 

+ case 0: // Не присвоенный код: считать AL? случай LineBreakUtils.LINE_BREAK_PROPERTY_AI: случай LineBreakUtils.LINE_BREAK_PROPERTY_SG: случай LineBreakUtils.LINE_BREAK_PROPERTY_XX:

Что это делает, это присвоить класс «AL» или «алфавитный» в любой элемент кода, который не был присвоен класс по Unicode. Это означает, что он будет рассматриваться как обычное письмо. Теперь, почему я задаю вопрос, уверены ли вы, что знаете, что делаете, заключается в том, что это может оказаться нежелательным. Возможно, рассматриваемый персонаж должен рассматриваться как пространство, а не буква. Юникод не определяет U + 1F7E, кроме как «зарезервированный» символ, поэтому имеет смысл, что Unicode не может сказать, что должно произойти с этим символом в контексте линейного преобразования ...

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

0

Кодовая точка U + 1F7E является частью греческого расширенного блока Unicode. Но это не представляет никакого реального характера; это зарезервированная, но неназначенная кодовая точка. Вот диаграмма из Unicode 6.0: http://www.unicode.org/charts/PDF/U1F00.pdf.

Таким образом, ошибки, которые вы получаете, возможно, не так удивительны.

+0

Привет, Mzjn, рассмотрите случай, который я получаю в потоке данных, и я конвертирую этот поток в PDF каждые 2 минуты, что мне следует показать, чтобы показать их как # или не показывать их вообще. Просто прошу о вашем опыте. – Geek

+0

@Geek, я действительно не имею никакого опыта обработки потоков данных в PDF. У вас есть контроль над потоком данных? Почему он содержит несуществующие «символы»? Если вы можете идентифицировать неназначенные кодовые точки, вы можете отобразить их как «#» или вообще нет. Возможно, вы можете использовать [Character.isLetter()] (http://download.oracle.com/javase/6/docs/api/java/lang/Character.html). Но это только я догадываюсь. – mzjn

0

Я побежал файл FO, который включал следующие <fo:block> как через ФОП 0,95 и 1,0 ФОП:

<fo:block>Unassigned code point: &#x1F7E;</fo:block> 

я получил тот же java.lang.ArrayIndexOutOfBoundsException, что вы видите.

При использовании смежную «реальный» характер, не было никакой ошибки:

<fo:block>Assigned code point: &#x1F7D;</fo:block> 

Таким образом, кажется, что вы должны убедиться, что поток данных не содержит не-символы, такие как U + 1F7E.

+0

Ошибка возникает из-за класса lineBreakUtil в FOP. Для каждого невидимого charachter массив возвращает значение 0, а FOP пытается получить доступ к массиву indiex [0-1] и, следовательно, исключение Array Indiex за пределами границ. Я вижу, что на FOP есть ошибка, связанная с этим, FOP должен обрабатывать случаи 0-1. – Geek

Смежные вопросы