1

我在 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。

4

1 回答 1

0

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

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

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

当算法进入阿拉伯字符时,它表示其双向状态并将其应用于以下下一个字符。根据W3C 的官方文件,这意味着:

左括号字形“{”的形状在 RTL 上下文中更改为“}”(从右到左)。所以从阿拉伯字符的角度来看,留给阿拉伯字符的序列是“1}”,这相当于通常的 LTR 形式“{1”。读取 ASCII 字符“1”后,unicode 算法评估现在上下文再次为 LTR,因此以正常形式“}”显示右括号。最终的视觉结果(但不是根据代码点)就像有一个额外的右括号和一个少一个左括号。

我希望 SO 读者如果在双向上下文中遇到类似的奇怪视觉效果,可能会发现这个解释很有用。

于 2014-09-03T12:24:13.083 回答