UnicodeString转换为char*(UTF-8)

9
我正在OS X上使用C++中的ICU库。 我的所有字符串都是UnicodeStrings,但我需要使用像fopen、fread等系统调用。 这些函数以const char*或char*作为参数。 我已经了解到OS X内部支持UTF-8,因此我只需要将我的UnicodeString转换为UTF-8,但我不知道如何做到这一点。
UnicodeString有一个toUTF8()成员函数,但它返回一个ByteSink。我还找到了这些示例:http://source.icu-project.org/repos/icu/icu/trunk/source/samples/ucnv/convsamp.cpp 并阅读了关于使用转换器的内容,但我仍然感到困惑。希望能够得到帮助。
3个回答

7

调用UnicodeString::extract(...)方法将内容提取到char*中,如果要使用默认转换器(即使用操作系统所使用的字符集),则传入NULL作为转换器参数。


1
谢谢!那个确实有效。我不确定destCapacity参数和UnicodeString的长度。这段代码可以工作:http://codepad.org/blaSP0ex 但是你会注意到我手动将UnicodeString的.length()加倍,以弥补多字节字符串的长度。我该如何确保我的char* dest有足够的空间? - zfedsa
谢谢。文档中提到最好猜测大小,如果出现缓冲区溢出错误,则再次调用提取函数并使用第一次调用返回的长度。我在这里这样做:http://codepad.org/nyp5yJWB 但是第二次调用仍然失败,尽管我提供了第一个提取调用返回的正确长度。我做错了什么? - zfedsa
我忘记使用 delete[] 而不是 delete,而且我认为我不需要 sizeof(我通常使用的是 C),但这些都是小细节。 - zfedsa
谢谢!现在一切都正常了。我不是想一直烦你,但似乎只有你知道关于 ICU 的事情。 - zfedsa
提取功能对我来说不起作用。总是出现一些错误。我需要将一个值记录在文件中,我使用了charAt(index):log_statement_orig.charAt(0)<<“\ n”;log_statement_orig.charAt(1)<<“\ n”;...看起来很愚蠢,但它有帮助。我将输出的整数写入了Unicode转换器(从十进制到Unicode),然后得到了字符串的值。只是我的项目构建需要30分钟,而且经常出现错误,所以我决定按照这种方式进行调试。当然,这仅适用于调试,不能用于生产代码。 - fresko
显示剩余3条评论

4

ICU用户指南 > UTF-8提供了执行此操作的方法和说明。

在UTF-16 API中使用UTF-8字符串最简单的方法是通过C++ icu::UnicodeString方法fromUTF8(const StringPiece& utf8)toUTF8String(StringClass& result)。 还有toUTF8(ByteSink& sink)

现在不推荐使用extract()

注意: icu :: UnicodeString 具有构造函数, setTo() extract()方法,可以接受转换器对象或字符集名称。 这些可以用于UTF-8,但与上述 fromUTF8() / toUTF8() / toUTF8String()方法相比,它们不那么高效或方便。


3
这将起作用:
std::string utf8;
uStr.toUTF8String(utf8);

这是一个旧帖子,正如你所看到的。从那时起,我一直在使用 gojava。应该注意 std::string,但我不记得 icuuStr 的所有权是什么。 - gsf
@Johnny_D,std::string 始终包含自定义的 char 数组。所以,不用担心 std::string utf8;,它会销毁字符串数组的自定义副本。 - Mister_Jesus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接