Если вы не хотите использовать ICU, вы всегда можете вручную проанализировать базу данных Unicode (.eg, со скриптом Python).Это текстовый файл, разделенный точкой с запятой, где каждая строка представляет символьную кодовую точку.Ищите пятую запись в каждой строке - это класс персонажа.Если это R
или AL
, у вас есть символ RTL, а 'L' - символ LTR.Другие классы - это слабые или нейтральные типы (например, цифры), которые, я думаю, вы бы хотели игнорировать.Используя эту информацию, вы можете создать таблицу поиска всех символов RTL, а затем использовать ее в своем коде C ++.Если вы действительно заботитесь о размере кода, вы можете минимизировать размер таблицы поиска в вашем коде, используя диапазоны (вместо записи для каждого символа), поскольку большинство символов входят в блоки своего класса BiDi.
Теперь определите функцию с именем GetCharDirection(wchar_t ch)
, которая возвращает значение перечисления (скажем: Dir_LTR
, Dir_RTL
или Dir_Neutral
), проверяя таблицу поиска.
Теперь вы можете определить функцию GetStringDirection(const wchar_t*)
который проходит через все символы в строке, пока не встретит символ, который не является Dir_Neutral.Этот первый ненейтральный символ в строке должен задать базовое направление для этой строки.Или, по крайней мере, так работает ICU.