如何使用fribidi重新排列双向文本

问题描述 投票:-1回答:1

我有一个英语-ASCII /阿拉伯语-Unicode组合字符串,如:

متن
abc
یک

3个Unicode阿拉伯字符+空格+ 3个Asci英文字符+空格+ 2个Unicode阿拉伯字符

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阿拉伯语表示形式B。因此,我需要将此字符串重新排序为以下Form:

重新排序的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”

to

重新排序的UTF16:“ \ xFB8F \ xFBFE \ x20 \ x31 \ x32 \ x33 \ x20 \ xFEE3 \ xFE98 \ xFEE3”

我认为我需要使用Fribidi来做到这一点。这就是我使用Fribidi的方式:

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);

但是输出与输入完全相同。和Fribidi而不是重新排序只是将输入复制到输出。方法Flags左右有什么问题吗?

我有一个组合的English-Asci /阿拉伯文-Unicode字符串,例如:متنabcی3 Unicode阿拉伯字符+空格+ 3 Asci英文字符+空格+ 2 Unicode阿拉伯字符UTF8:“ \ xD9 \ x85 \ xD8 \ xAA \。 ..

c unicode unicode-string freetype harfbuzz
1个回答
0
投票

问题出在错误的pbase_dir标志上。使用下面的标志

FriBidiCharType             pbase_dir                                       = FRIBIDI_TYPE_RTL;
© www.soinside.com 2019 - 2024. All rights reserved.