我在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。
答案 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如果在双向环境中遇到类似的奇怪视觉效果,可能会发现这种解释很有用。