Unicode FOP对希腊文字的解读
你能帮我解释一下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都失败了,这些字符不可显示,并且出现了类似的错误 这些特殊字符是什么?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
为什么这些字符没有显示这些换行符或制表符?
有人用FOP解决过类似的问题吗?U+1F7E代码点是希腊语扩展Unicode块的一部分。但它并不代表任何实际性质;它是一个保留但未分配的代码点。以下是Unicode 6.0中的图表:
因此,你所得到的错误也许并不令人惊讶 我通过FOP 0.95和FOP 1.0运行了一个FO文件,其中包括以下
:
<fo:block>Unassigned code point: ὾</fo:block>
Unassigned代码点:;
我确实得到了与您看到的相同的java.lang.ArrayIndexOutOfBoundsException
使用相邻的“实”字符时,没有错误:
<fo:block>Assigned code point: ώ</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的情况。