如何使用 fribidi 重新排序双向文本
How to reorder bidirectional text using fribidi
我有一个组合的英语-ASCII/阿拉伯语-Unicode 字符串,如:
متن
abc
یک
3个Unicode阿拉伯字符+space+3个ASCII英文字符+space+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 Arabic Presentation Form B。
因此,我需要将此字符串重新排序为以下形式:
Reordered 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"
到
Reordered 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 之类的方法有什么问题吗?
问题在于使用了错误的 pbase_dir
标志。使用下面的标志
FriBidiCharType pbase_dir = FRIBIDI_TYPE_RTL;
Fribidi 工作正常并按预期正确地重新排序我的文本。
我有一个组合的英语-ASCII/阿拉伯语-Unicode 字符串,如:
متن
abc
یک
3个Unicode阿拉伯字符+space+3个ASCII英文字符+space+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 Arabic Presentation Form B。 因此,我需要将此字符串重新排序为以下形式:
Reordered 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"
到
Reordered 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 之类的方法有什么问题吗?
问题在于使用了错误的 pbase_dir
标志。使用下面的标志
FriBidiCharType pbase_dir = FRIBIDI_TYPE_RTL;
Fribidi 工作正常并按预期正确地重新排序我的文本。