Unicode FOP对希腊文字的解读

Unicode FOP对希腊文字的解读,unicode,character-encoding,xsl-fo,apache-fop,Unicode,Character Encoding,Xsl Fo,Apache Fop,你能帮我解释一下HTML显示为HTML=὾;和十六进制值01F7E 这些字符的详细信息可以在下面的URL上找到 当我在ApacheFop中运行这个角色时,他们会给我一个ArrayIndexOut-Bounds异常 原因:java.lang.ArrayIndexOutOfBoundsException:-1 位于org.apache.fop.text.linebreak.LineBreakUtils.getLineBreakPairProperty(LineBreakUtils.jav

你能帮我解释一下HTML显示为HTML=὾;和十六进制值01F7E

这些字符的详细信息可以在下面的URL上找到

当我在ApacheFop中运行这个角色时,他们会给我一个ArrayIndexOut-Bounds异常

原因: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都失败了,这些字符不可显示,并且出现了类似的错误

这些特殊字符是什么?
为什么这些字符没有显示这些换行符或制表符?

有人用FOP解决过类似的问题吗?

U+1F7E代码点是希腊语扩展Unicode块的一部分。但它并不代表任何实际性质;它是一个保留但未分配的代码点。以下是Unicode 6.0中的图表:


因此,你所得到的错误也许并不令人惊讶

我通过FOP 0.95和FOP 1.0运行了一个FO文件,其中包括以下

<fo:block>Unassigned code point: &#x1F7E;</fo:block>
Unassigned代码点:὾;
我确实得到了与您看到的相同的java.lang.ArrayIndexOutOfBoundsException

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

<fo:block>Assigned code point: &#x1F7D;</fo:block>
指定的代码点:ώ;
因此,您似乎必须确保数据流不包含U+1F7E这样的非字符。

来自Apache的答案

乍一看,这似乎是在FOP中实现Unicode换行时的一个小疏忽。这没有考虑到在换行上下文中给定的代码点没有分配“类”的可能性。(= 文件中未显示U+1F7E ,作为在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? 案例LineBreakUtils.LINE\u BREAK\u属性\u AI: 案例LineBreakUtils.LINE\u BREAK\u属性\u SG: 案例LineBreakUtils.LINE\u BREAK\u属性\u XX:

这样做的目的是将类“AL”或“字母”分配给任何未通过Unicode分配类的代码点。这意味着它将被视为普通信件。 现在,我问你是否确定你知道你在做什么的原因是,这可能是不可取的。可能需要将所讨论的字符视为空格而不是字母。 Unicode除了将U+1F7E定义为“保留”字符外,并没有将其定义为其他字符,因此Unicode无法说明在换行上下文中该如何处理该字符是有意义的


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

HMZJN,考虑一个我在数据流中得到这些数据的情况,我每2分钟将这个流转换成PDF,我应该做什么来显示它们,或者不显示它们。只是问问你的经验。@Geek,我真的没有把数据流处理成PDF的经验。你能控制数据流吗?为什么它包含不存在的“字符”?如果可以识别未分配的代码点,则可以将它们显示为“#”,或者根本不显示。也许你可以用。但这只是我的猜测。错误是因为FOP中的lineBreakUtil类。对于每个不可见的字符,数组返回一个值0,然后FOP尝试访问indiex数组[0-1],从而访问数组indiex越界异常。我看到在FOP上出现了一个错误,FOP应该处理0-1的情况。