Как вычислить строку Unicode, в которой указано двунаправленное представление? - PullRequest
0 голосов
/ 29 апреля 2010

молодцы. У меня довольно извращенный вопрос. Пожалуйста, прости меня:)

Существует официальный алгоритм, который описывает, как должен быть представлен двунаправленный текст Unicode. http://www.unicode.org/reports/tr9/tr9-15.html

Я получаю строку (из какого-либо стороннего источника), которая содержит символы латинского и иврита, а также цифры, пробелы, знаки пунктуации и т. Д.

Проблема в том, что полученная мной строка уже в форме представления. То есть - последовательность символов, которые я получаю, должна быть представлена ​​слева направо.

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

Предполагая следующее:

  • Направление текста по умолчанию (объекта рендеринга) - RTL.
  • Я не хочу вставлять «специальные символы Юникода», которые явно переопределяют направление текста (например, RLO, RLE и т. Д.)
  • Я подозреваю, что может существовать несколько решений. Если так - я бы хотел сохранить RTL-вид строки в максимально возможной степени. Строка обычно состоит из еврейских слов в основном. Я хотел бы сохранить правильный порядок этих слов и символов внутри этих слов. Принимая во внимание, что другие последовательности символов могут (и должны) быть транспонированы.

Один наивный способ решить эту проблему - просто поменять всю строку (это заботится о еврейских словах), а затем обменять внутри нее последовательности не-ивритских символов. Это, однако, не всегда дает правильные результаты, потому что фактические правила представления довольно сложны.

Единственный комплексный алгоритм, который я пока вижу, - это проверка методом перебора. Строка может быть разделена на последовательности символов одного класса. Эти последовательности могут быть объединены в случайном порядке, плюс любая из них может быть обращена вспять. Я могу проверить все эти комбинации, чтобы получить правильный результат. Плюс эта техника может быть оптимизирована. Например, порядок слов на иврите известен, поэтому нам нужно только проверить различные комбинации их «соединяющих» последовательностей.

Есть идеи получше? Если у вас есть идея, не обязательно все решение - это нормально. Я ценю любую идею. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 мая 2010

Если вы хотите проверить, является ли символ двунаправленным, вы должны использовать UCD (Unicode Character Database), которая предоставляется Unicode.org и содержит много информации о символах. в одном из этих атрибутов БД вы можете найти двунаправленность символа

Итак, вам нужно скачать USD, затем написать класс для поиска вашего персонажа в XML и вернуть ответ

Я сделал это в C # -приложении с открытым исходным кодом, и вы можете посмотреть его здесь http://Unicode.Codeplex.com

Пожалуйста, дайте мне знать, ваша проблема решена этим или нет.

0 голосов
/ 06 мая 2010

Насер, спасибо за ответ. К сожалению, это не полностью решает мою проблему.

Пока что для каждого персонажа я знаю его направленность. Тем не менее я не вижу, как я могу вычислить всю строку, чтобы ее представление соответствовало тому, что мне нужно.

Представьте, что вы хотите, чтобы следующий текст был написан слева направо, тогда как иврит / арабские символы обозначены БОЛЬШИМ:

ABC rus 123 456 DEF

Правильная строка будет выглядеть так: FED 456 123 eng CBA или также: FED eng 456 123 CBA

Или, если используются явные коды переопределения направления, это можно записать так: FED eng 123 456 CBA

В настоящее время я решил эту проблему, введя в строку явные коды переопределения направленности. Чтобы я выделил последовательности слов на иврите / арабском языке и для всех присоединяющихся LTR / слабых / нейтральных символов я явно переопределил направление на LTR.

Однако я бы хотел сделать это без введения явных кодов переопределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...