netlib.narod.ru< Назад | Оглавление | Далее >

Проблема с текстом, выводимым справа налево

Выше я сказал, что по функциональности программа TypeAway почти полностью соответствует элементу управления TextBox, работающему в режиме обработки одной строки, кроме двух моментов. Первая проблема в том, что TypeAway не поддерживает буфер обмена, вторая — TypeAway некорректно показывает каретку при наборе текста, который пишется справа налево, например, на арабском и иврите.

Рассмотрим эти проблемы. Запустите TypeAway и переключитесь на раскладку для иврита. Мы наберем фразу «Доброе утро» на иврите: . Ее латинская транслитерация выглядит как «boker tov». Чтобы сделать этот маленький трюк на английской клавиатуре, надо знать, какие символы иврита соответствуют ее клавишам.


Алфавит иврита



Код Unicode Буква Начертание Клавиша Код Unicode Буква Начертание Клавиша

0x05D0 Алеф t 0x05DE Мэм n
0x05D1 Бет c 0x05DF Нун конечная i
0x05D2 Гимел d 0x05E0 Нун b
0x05D3 Далет s 0x05E1 Самех x
0x05D4 Хэй v 0x05E2 Фин g
0x05D5 Вав u 0x05E3 Пэй конечная ;
0x05D6 Заин z 0x05E4 Пэй p
0x05D7 Хэт j 0x05E5 Цади конечная .
0x05D8 Тэт y 0x05E6 Цади m
0x05D9 Йод h 0x05E7 Коф e
0x05DA Каф конечная l 0x05E8 Реш r
0x05DB Каф f 0x05E9 Шин a
0x05DC Ламед k 0x05EA Тав ,
0x05DD Мэм конечная o        


Названия этих букв я нашел в описании третьей версии стандарта Unicode. Как видите, в название некоторых из них входит слово «конечная»: такие буквы пишутся иначе, если стоят в конце слова.

Также следует знать, что на иврите пишут справа налево. Таким образом, чтобы набрать вышеуказанную фразу на иврите в TypeAway, надо вводить буквы в таком порядке: бет (клавиша c), вав (клавиша u), коф (клавиша e), реш (клавиша r), пробел, тэт (клавиша y), вав (клавиша u) и снова бет (клавиша c). TypeAway хранит символы Unicode в символьной строке в порядке их ввода, и это правильно. Метод DrawString выводит эти символы справа налево, что тоже правильно. Поэтому методу DrawString надо отдать должное и поздравить его с тем, что он смог узнать и правильно вывести текст, читающийся справа налево.

Теперь вы знаете, почему TypeAway должна полностью стирать ранее нарисованную текстовую строку: вводимый текст вовсе не обязательно добавляется к концу строки. При наборе на иврите новый текст должен выводиться в начале, а не в конце строки. Набор арабских текстов еще сложнее: в арабском письме соседние символы часто объединяются и образуют символы с другим начертанием. Чтобы корректно обработать такую ситуацию, DrawString должен рисовать всю строку сразу, а не отдельные символы.

Позиционирование каретки — именно то, с чем не справляется TypeAway. При вводе текста справа налево каретка не соответствует точке вставки. Решение этой проблемы нетривиально, особенно когда приходится иметь дело со строками, включающими текст, читающийся в разных направлениях. Похоже, что в Windows Forms не хватает средств для решения этих проблем. Если вам интересно, как они решаются при помощи API Win32, прочитайте статью «Supporting Multilanguage Text Layout and Complex Scripts with Windows NT 5.0» в ноябрьском выпуске журнала Microsoft Systems Journal за 1998 г.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz