CLDR-arabic语言环境中的奇怪列表模式格式

时间:2014-09-02 14:36:47

标签: unicode internationalization bidi cldr

我在CLDR-25-data中观察了阿拉伯语语言环境中列表模式格式的条目(类似于希伯来语):

<listPatterns>
  <listPattern>
    <listPatternPart type="start" draft="contributed">{0}، {1}</listPatternPart>
    <listPatternPart type="middle" draft="contributed">{0}، {1}</listPatternPart>
    <listPatternPart type="end" draft="contributed">{0}، و {1}</listPatternPart>
    <listPatternPart type="2" draft="contributed">{0} و {1}</listPatternPart>
  </listPattern>
</listPatterns>

请注意,LDML规范仅说明“{0}”或“{1}”形式的占位符(不像列表模式部分中的“end”和“2”类型)。另见:

http://cldr.unicode.org/development/development-process/design-proposals/list-formatting

http://cldr.unicode.org/translation/lists

我怀疑这与从右到左的风格有关,但具体如何?


更新

现在我已经编写了一个小型Java程序来查看真实的字符序列。

String s = "{0} و {1}"; // as displayed in browser or IDE-window
for (char c : s.toCharArray()) {
    System.out.println(c);
}

输出结果为:

{
0
}

و

{
1
}

所以它似乎是一个显示问题,而不是char序列本身的问题?!我使用Internet Explorer版本9和Eclipse 4.3。

1 个答案:

答案 0 :(得分:0)

char序列在这里(在代码点中):

123=>{
48=>0
125=>}
32=> 
1608=>و   // DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC=true
32=> 
123=>{
49=>1
125=>}

Unicode也可以通过评估双向上下文来推断显示样式。所以这里的unicode算法似乎首先将标准LTR上下文应用于找到的第一个字符 - 因此保留了char序列“{0 }“。

当算法输入阿拉伯字符时,它表示其双向状态并将其应用于下面的下一个字符。根据{{​​3}},这意味着:

在RTL上下文(从右到左)中,左括号字形“{”的形状变为“}”。因此,从阿拉伯字符的角度来看,留给阿拉伯字符的序列是“1}”,这相当于通常的LTR形式“{1”。在读取了ASCII-char“1”之后,unicode算法再次评估上下文是LTR,因此以正常形式“}”显示结束括号。然而,最终的视觉结果(不是在代码点方面)就好像有一个额外的闭合括号和一个较少的开口括号。

我希望SO-readers如果在双向环境中遇到类似的奇怪视觉效果,可能会发现这种解释很有用。