FOP对希腊字符的解读

时间:2010-12-14 13:03:04

标签: unicode character-encoding xsl-fo apache-fop

你能帮我解释HTML格式的希腊字符HTML =& amp; #8062;和十六进制值01F7E

可在以下网址

找到这些字符的详细信息

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

当我在Apache FOP中运行此角色时,它们会给我一个Bounds Exception的ArrayIndexOut

引起: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代码时,我无法理解LineBreakUtils.java中对lineBreakProperties [] []数组的需要。

我还注意到上面提到的所有希腊字符的FOP都失败了,这些字符是不可显示的,但是有类似的错误。

这些特殊字符是什么?
为什么这些字符的无显示是这些换行符还是TAB的? 有没有人用FOP解决过类似的问题?

3 个答案:

答案 0 :(得分:0)

U + 1F7E代码点是希腊语扩展Unicode块的一部分。但它并不代表任何实际的性格;它是一个保留但未分配的代码点。以下是Unicode 6.0的图表:http://www.unicode.org/charts/PDF/U1F00.pdf

所以你得到的错误可能并不那么令人惊讶。

答案 1 :(得分:0)

我通过FOP 0.95和FOP 1.0运行了一个包含以下<fo:block>的FO文件:

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

我确实得到了你所看到的java.lang.ArrayIndexOutOfBoundsException。

使用相邻的“真实”字符时,没有错误:

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

所以看起来你必须确保你的数据流不包含像U + 1F7E这样的非字符。

答案 2 :(得分:0)

来自Apache的回答

乍一看,这似乎是FOP中Unicode断行实现的一个小小疏忽。这没有考虑给定代码点在换行上下文中没有分配“类”的可能性。 (= 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) {

+ case 0://未分配的代码点:视为AL?              case LineBreakUtils.LINE_BREAK_PROPERTY_AI:              case LineBreakUtils.LINE_BREAK_PROPERTY_SG:              case LineBreakUtils.LINE_BREAK_PROPERTY_XX:

这样做是将类“AL”或“字母”分配给尚未通过Unicode分配类的任何代码点。这意味着它将被视为常规信件。 现在,我问你是否确定你知道你在做什么的问题是,这可能会变得不可取。也许这个角色需要被视为一个空间而不是一个字母。 除了作为“保留”字符之外,Unicode没有定义U + 1F7E,因此Unicode无法说明在换行符的情况下该字符应该发生什么......

那就是说,在这种情况下FOP崩溃也是错误的,所以这个bug肯定是真的。