Каков принцип отображения разных языков (арабского и английского) вместе? - PullRequest
2 голосов
/ 14 декабря 2011

Такие, как это предложение:

عفوا يبدو أن النظام لا يستطيع تحديد أنك من عملاء STC أم لا, فإذا كنت عميل STC الرجاء الضغط على زر "إعادة المحاولة", وإذا لم تكن من عملاء STCالرجاء الضغط على زر "لست عميل STC

Арабский - это RTL, а английский - LTR. Иногда после копирования и вставки текста происходит беспорядок. Когда я перемещаю курсор внутри предложения между английскими и арабскими символами, он прыгаеточень странным образом. И я также путаюсь с тем, как это хранится в памяти. Кто-нибудь может помочь объяснить это?

Ответы [ 2 ]

6 голосов
/ 14 декабря 2011

В памяти все это хранится в виде последовательности кодовых точек Unicode (надеюсь, до этого были очень странные вещи, но давайте не будем идти туда) - это сам текст, как он представлен на компьютере. Поначалу текст не зависит от направления письма, это просто последовательность символов.

Эта последовательность проходит через механизм рендеринга, который знает алгоритм Unicode Bidi и, таким образом, может преобразовывать текст в глифы для отображения в определенной позиции. Каждый персонаж в Unicode имеет свойство Bidi, которое контролирует его поведение в таких контекстах. Это указывает, что a является символом LTR, а א является символом RTL; он контролирует, чтобы круглые скобки правильно отражались в контекстах RTL (открывающая скобка по-прежнему ( в тексте, даже если вы видите )); и несколько символов могут появляться в обоих контекстах. Все это очень упрощено, и там есть немало вещей, которые можно поработать. Наконец, несколько глифов могут накладываться друг на друга (например, диакритические знаки) или образовывать лигатуры; тогда это графемы, что по сути то, что мы воспринимаем как «письмо».

Тогда перемещение курсора легко выполнить, потому что курсор может быть только между двумя графемами (он становится более сложным в начале сегмента LTR или RTL, но давайте пока оставим это без изменений) и переместил вперед через них, а движется назад. В RTL форварды, конечно, означает left ; это следует за направлением текста. Порядок расположения двух графем относительно друг друга не имеет значения при позиционировании курсора.

Хотя я признаю, что смешанный текст RTL и LTR может показаться странным, но я думаю, что люди в арабских или ивритоязычных странах довольно привыкли к этому.

Что касается проблемы, заключающейся в том, что правильный текстовый макет иногда теряется при копировании и вставке текста, я предполагаю, что наиболее распространенной проблемой является поддержка приложения или механизма компоновки для соответствующего сценария. Если механизм верстки не знает, как макетировать арабский текст, все, что вы получаете, это символы в их логическом порядке слева направо. Никакие лигатуры не формируются, текстовое направление не применяется. Например, браузеры уже неплохо поддерживают такие вещи, но если я возьму арабский текст и вставлю его в Word, он будет выглядеть неправильно (в случае с Word 2007; PowerPoint справился, однако). К сожалению, это не легко исправить, но, как правило, текст, который вы скопировали, точно такой же, просто неправильный дисплей.

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

3 голосов
/ 14 декабря 2011

Письма хранятся в логическом порядке;это означает, что предложение типа "Привет! Салам!"фактически хранится с буквами именно в таком порядке.

В дополнение к этому, однако, к тексту добавляются также определенные флаги Юникода, которые информируют механизм размещения текста о том, что часть предложения «Салам» должнабыть обратным при отображении;таким образом, окончательная разметка текста становится «Hello! maalaS!», а также должна быть.

Эти флаги либо устанавливаются посредством естественной классификации BIDI;например, غ ;или с помощью Unicode RTL и LTR маркеров, U + 200E и U + 200F .

Если вы обратите внимание, курсор на самом деле не прыгаеткак ни странно, он всегда следует логическому порядку символов.

...