C 如何使用Fribdi对双向文本重新排序
我有一个组合的英语ASCII/阿拉伯语Unicode字符串,如:C 如何使用Fribdi对双向文本重新排序,c,unicode,unicode-string,freetype,harfbuzz,C,Unicode,Unicode String,Freetype,Harfbuzz,我有一个组合的英语ASCII/阿拉伯语Unicode字符串,如: متن abc یک 3个Unicode阿拉伯文字符+空格+3个ASCII英文字符+空格+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” 为了以上述的联合形式显示文本,MyEmbedded de
متن
abc
یک
3个Unicode阿拉伯文字符+空格+3个ASCII英文字符+空格+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”
为了以上述的联合形式显示文本,MyEmbedded devices API以相反的顺序接受Unicode阿拉伯语表示形式B。
因此,我需要将此字符串重新排序为以下形式:
重新排序的UTF16:“\xFB8F\xFBFE\x20\x31\x32\x33\x20\xFEE3\xFE98\xFEE3”
并将其转换为UTF8表示形式B:
UTF8格式:“\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”
我想我需要用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,而不是重新排序,只是将输入复制到输出。
方法标志等是否有任何错误?问题在于使用了错误的
pbase\u dir
标志。使用下面的标志
FriBidiCharType pbase_dir = FRIBIDI_TYPE_RTL;
Fribidi工作正常,并按预期正确地重新排列我的文本。请添加一个。有了这些片段,很难(如果不是不可能的话)进行测试。此外,如果你真的有3行输入,那么考虑使用一个不同的函数。代码>fribidi_log2vis(…)无法处理多行输入。@DuckDodgers不,这是单行文本。由于stackoverflow输入文本框中的Bidi问题,我将其分为3行。正如我上面所描述的,它是:3个Unicode阿拉伯字符+空格+3个Asci英语字符+空格+2个Unicode阿拉伯字符