如何在C++中使用FriBidi处理std::string并解决乱码问题?
FriBidi处理UTF-8字符串乱码问题
需要实现一个函数,通过FriBidi算法处理std::string并返回重排后的字符串,要求对任意std::string安全,处理失败时返回原字符串。为避免std::wstring转换,编写了如下测试代码,但运行后出现乱码。
测试代码
// fribidi-test.cpp #include <cstring> #include <iostream> #include <string> #include <stdio.h> #define FRIBIDI_NO_DEPRECATED #include <fribidi/fribidi.h> std::string fribidi_str_convert(std::string string_orig) { std::cerr << "dbg: orig: " + string_orig + "\n"; FriBidiChar fribidi_in_char; FriBidiStrIndex fribidi_len = fribidi_charset_to_unicode( FRIBIDI_CHAR_SET_UTF8, string_orig.c_str(), string_orig.size(), &fribidi_in_char ); fprintf(stderr, "len is %i\n", fribidi_len); // 让FriBidi自动判断主方向 FriBidiCharType fribidi_pbase_dir = FRIBIDI_TYPE_LTR; // 准备输出变量 FriBidiChar fribidi_visual_char; fribidi_boolean stat = fribidi_log2vis( /* input */ &fribidi_in_char, fribidi_len, &fribidi_pbase_dir, /* output */ &fribidi_visual_char, NULL, NULL, NULL ); fprintf(stderr, "stat is: %d\n", stat); if (stat) { char string_formatted_ptr; // 转换回UTF-8 FriBidiStrIndex new_len = fribidi_unicode_to_charset( FRIBIDI_CHAR_SET_UTF8, &fribidi_visual_char, fribidi_len, &string_formatted_ptr ); fprintf(stderr, "new_len is: %d\n", new_len); if (new_len) { fprintf(stderr, "string_formatted_ptr is: %s\n", &string_formatted_ptr); std::string string_formatted_out(&string_formatted_ptr, new_len); return string_formatted_out; }; }; return string_orig; }; int main() { std::string orig = "אריק איינשטיין"; std::cerr << "main: orig: " + orig + "\n"; std::cerr << "main: transformed: " + fribidi_str_convert(orig) + "\n"; };
编译运行命令
g++ $(pkg-config --libs fribidi) fribidi-test.cpp -o fribidi-test && ./fribidi-test
实际输出
main: orig: ןייטשנייא קירא dbg: orig: ןייטשנייא קירא len is 14 stat is: 2 new_len is: 27 string_formatted_ptr is: אĐןייטשנייא קי main: transformed: אĐןייטשנייא ק
期望输出
main: orig: ןייטשנייא קירא dbg: orig: ןייטשנייא קירא len is 14 stat is: 2 new_len is: 27 string_formatted_ptr is: אריק איינשטיין main: transformed: אריק איינשטיין
疑问
该乱码问题是否与UTF16编码及输出长度异常(原长度14,输出长度27)有关?
内容的提问来源于stack exchange,提问作者Doron Behar
相关产品推荐
相关产品推荐

