Тълкуване на гръцки букви от FOP

Можете ли да ми помогнете да интерпретирам гръцките символи с HTML дисплей като HTML= & #8062; и шестнадесетична стойност 01F7E

Подробности за тези знаци можете да намерите на URL адреса по-долу

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

Когато стартирам този знак в Apache FOP, те ми дават ArrayIndexOut of Bounds Exception

Причинено от: java.lang.ArrayIndexOutOfBoundsException: -1 в org.apache.fop.text.linebreak.LineBreakUtils.getLineBreakPairProperty(LineBreakUtils.java:668) в org.apache.fop.text.linebreak.LineBreakStatus.nextChar(LineBreakStatus.java :117)

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

Също така забелязах, че FOP се проваля за всички гръцки знаци, споменати на страницата по-горе, които не се показват с подобна грешка.

Какви са тези специални символи?
Защо не се показват за тези знаци, това са прекъсвания на редове или TAB?
Някой решавал ли е подобен проблем с FOP?


person Geek    schedule 14.12.2010    source източник


Отговори (3)


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

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

person mzjn    schedule 23.12.2010
comment
Здравейте Mzjn, помислете за случай, в който получавам тези в поток от данни и конвертирам този поток в PDF на всеки 2 минути, какво трябва да направя, да ги покажа като # или изобщо да не ги покажа. Просто питам от вашия опит. - person Geek; 24.12.2010
comment
@Geek, всъщност нямам никакъв опит с обработката на потоци от данни в PDF. Имате ли някакъв контрол върху потока от данни? Защо съдържа несъществуващи знаци? Ако можете да идентифицирате неприсвоени кодови точки, тогава може да сте в състояние да ги покажете като # или изобщо да не ги показвате. Може би можете да използвате Character.isLetter(). Но това само предполагам. - person mzjn; 25.12.2010

Пуснах FO файл, който включва следното <fo:block> през FOP 0.95 и FOP 1.0:

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

Получих същото java.lang.ArrayIndexOutOfBoundsException, което виждате.

При използване на съседен "истински" символ нямаше грешка:

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

Така че изглежда, че трябва да се уверите, че вашият поток от данни не съдържа несимволи като U+1F7E.

person mzjn    schedule 01.01.2011
comment
Грешката идва поради класа lineBreakUtil във FOP. За всеки невидим символ масивът връща стойност 0 и след това FOP се опитва да получи достъп до indiex Array[0-1] и следователно до Array Indiex извън границите на изключението. Виждам, че има повдигната грешка във FOP за това, FOP трябва да се справи със случаите 0-1. - person Geek; 06.01.2011

Отговор от Apache

На пръв поглед това изглежда като малък пропуск при внедряването на Unicode linebreaking във FOP. Това не взема предвид възможността на дадена кодова точка да не е присвоен „клас“ в контекста на прекъсване на реда. (= U+1F7E не се появява във файла http://www.unicode.org/Public/UNIDATA/LineBreak.txt, който се използва като основа за генериране на тези масиви в LineBreakUtils.java)

От друга страна, очевидно може да се повдигне въпросът защо толкова отчаяно се нуждаете от неприсвоена кодова точка във вашия изход. Сигурен ли си, че имаш нужда от това? Ако да, тогава можете ли да уточните точната причина? (т.е. за какво точно се използва тази неприсвоена кодова точка?)

Най-простата „поправка“ изглежда приблизително следната:

Индекс: src/java/org/apache/fop/text/linebreak/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) {

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

Това, което прави, е да присвоите класа „AL“ или „Alphabetic“ на всяка кодова точка, на която не е присвоен клас от Unicode. Това означава, че ще се третира като обикновено писмо. Сега, причината, поради която задавам въпроса дали сте сигурни, че знаете какво правите, е, че това може да се окаже нежелателно. Може би въпросният знак трябва да се третира като интервал, а не като буква. Уникод не дефинира U+1F7E освен като „запазен“ знак, така че има смисъл, че Уникод не може да каже какво трябва да се случи с този знак в контекста на прекъсване на ред...

Въпреки това е погрешно FOP да се срива в този случай, така че грешката определено е истинска.

person Geek    schedule 07.01.2011