Как изменить порядок двунаправленного текста с помощью фрибиди - PullRequest
1 голос
/ 30 сентября 2019

У меня есть объединенная английская-ASCII / арабская-Unicode строка вроде:

متن
abc
یک

3 Юникод арабский символ + пробел + 3 ASCII английский символ + пробел + 2 Юникод арабский символ

UTF8: "\ xD9 \ x85 \ xD8 \ xAA \ xD9 \ x86 \ x20 \ x31 \ x32 \ x33 \ x20 \ xD9 \ x8C \ xD8 \ xA9"

UTF16: "\ xFEE3 \ xFE98\ xFEE3 \ x20 \ x31 \ x32 \ x33 \ x20 \ xFBFE \ xFB8F "

Для отображения текста в объединенной форме, как указано выше, API-интерфейс моих встроенных устройств принимает Unicode Arabic Presentation Form B в обратном порядке. Для этого мне нужно переупорядочить эту строку ниже: Форма:

Переупорядочено UTF16: "\ xFB8F \ xFBFE \ x20 \ x31 \ x32 \ x33 \ x20 \ xFEE3 \ xFE98 \ xFEE3"

и преобразовать его в форму представления UTF8 B:

UTF8_FormB: "\ xef \ xae \ x8f \ xef \ xaf \ xbe \ x20 \ x31 \ x32 \ x33 \ x20 \ xef\ xbb \ xa6 \ xef \ xba \ x98 \ xef \ xbb \ xa3 "

Мой вопрос касается шага переупорядочения, который переупорядочивается

UTF16:" \ xFEE3 \ xFE98\ xFEE3 \ x20 \ x31 \ x32 \ x33 \ x20 \ xFBFE \ xFB8F "

до

Переупорядочено в UTF16:" \ xFB8F \ xFBFE \ x20 \ x31 \ x32\ x33 \ x20 \ xFEE3 \ xFE98 \ xFEE3 "

Я думаю, мне нужно использовать Фрибиди, чтобы сделать это. Вот как я использую Фрибиди:

uint32_t                utf16Str[256]       = { 0};
uint32_t                reorderedStr[256]   = { 0};
uint16_t                rawLen              = 0;
uint16_t                utf16Len            = 0;
FriBidiCharType         pbase_dir           = FRIBIDI_TYPE_ON;
fribidi_boolean         stat;

    stat =  fribidi_log2vis(
    /* input */
    utf16Str,//UTF16: "\xFEE3\xFE98\xFEE3\x20\x31\x32\x33\x20\xFBFE\xFB8F" // یک abc متن
    utf16Len,//10
    &pbase_dir,
    /* output */
    reorderedStr,//this must be filled with reordered string.
    NULL,
    NULL,
    NULL);

Но вывод точно такой же, как и вход. И Фрибиди вместо переупорядочения просто скопировал входные данные на выход. Что-то не так с методом Flags и тому подобным?

1 Ответ

4 голосов
/ 08 октября 2019

Проблема заключалась в использовании неправильного флага pbase_dir. Используя флаг ниже

FriBidiCharType pbase_dir = FRIBIDI_TYPE_RTL;

Фрибиди работает нормально и корректно меняет мой текст, как и ожидалось.

...