2014-09-02 6 views
1

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

<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

или

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

Я подозреваю, что это что-то делать с правом налево стиле, но как в деталях?


UPDATE:

Теперь я написал небольшую программу 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.

ответ

0

последовательность полукокса здесь (в кодовых):

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

Unicode выводит стиль отображения также от оценки двунаправленного контекста. Итак, алгоритм Unicode, по-видимому, сначала применяет стандартный LTR-контекст к первым найденным символам - следовательно, сохраняется последовательность символов «{0}».

Когда алгоритм входит в арабский символ, он обозначает его двунаправленный статус и применяет его к следующим следующим символам. В соответствии с official paper of W3C это означает:

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

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