Странный формат шаблона списка в CLDR-арабской локали

Я наблюдал в данных CLDR-25 следующие записи для форматов шаблонов списков на арабском языке (аналогично также на иврите):

<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}" (в отличие от частей шаблона списка для типов "конец" и "2"). Смотрите также:

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

or

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
}

Так что это проблема отображения, а не проблема самой последовательности символов?! Я использую Internet Explorer версии 9 и Eclipse 4.3.


person Meno Hochschild    schedule 02.09.2014    source источник


Ответы (1)


Последовательность символов здесь (в кодовых точках):

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

Юникод выводит стиль отображения также из оценки двунаправленного контекста. Таким образом, здесь алгоритм юникода, по-видимому, сначала применяет стандартный LTR-контекст к первым найденным символам, тем самым сохраняя последовательность символов "{0}".

Когда алгоритм вводит арабский символ, он обозначает свой двунаправленный статус и применяет его к следующим следующим символам. Согласно официальному документу W3C это означает:

Форма глифа открывающей скобки "{" меняется на "}" в RTL-контексте (справа налево). Таким образом, с точки зрения arabic char последовательность слева от arabic char равна «1}», и это эквивалентно обычной LTR-форме «{1». После чтения ASCII-символа «1» алгоритм юникода оценивает, что теперь контекст снова LTR, поэтому закрывающая скобка отображается в нормальной форме «}». Окончательный визуальный результат (однако, не с точки зрения кодовых точек) выглядит так, как если бы была одна дополнительная закрывающая скобка и на одну открывающую скобку меньше.

Я надеюсь, что читатели SO сочтут это объяснение полезным, если они столкнутся со схожими странными визуальными эффектами в двунаправленном контексте.

person Meno Hochschild    schedule 03.09.2014