2010-06-30 43 views
8

我使用ICU库在C++在OS X上我所有的字符串是UnicodeStrings,但我需要使用系统调用像FOPEN,FREAD等等。这些函数使用const char *或char *作为参数。我已经读过OS X在内部支持UTF-8,所以我需要做的就是将UnicodeString转换为UTF-8,但我不知道该怎么做。的UnicodeString为char *(UTF-8)

的UnicodeString具有toUTF8()成员函数,但它返回一个ByteSink。我也发现了这些例子:http://source.icu-project.org/repos/icu/icu/trunk/source/samples/ucnv/convsamp.cpp并阅读了关于使用转换器,但我仍然困惑。任何帮助将非常感激。

回答

7

呼叫UnicodeString::extract(...)提取到一个char *,传递NULL该转换器可以得到默认的转换器(这是您的操作系统将使用该字符集)。

+1

谢谢!这确实有效。我不确定destCapacity参数和UnicodeString的长度。此代码的工作原理:http://codepad.org/blaSP0ex但您会注意到我手动加倍UnicodeString的.length()以弥补多字节字符串。我如何确保char * dest中有足够的空间? – zfedsa 2010-06-30 18:55:54

+0

http://icu-project.org/apiref/icu4c/classUnicodeString.html#125255f27efd817e38806d76d9567345 如果没有足够的空间,它将返回输出字符串所需的长度和状态为U_BUFFER_OVERFLOW_ERROR的状态。请参阅http://userguide.icu-project.org/strings#TOC-Using-C-Strings:-NUL-Terminated-vs%2e – 2010-07-01 00:04:13

+0

谢谢。该文档说最好猜测大小以及是否存在缓冲区溢出错误,然后再次调用具有从第一次调用返回的长度的提取函数。我这样做:http://codepad.org/nyp5yJWB但第二个调用仍然失败,即使我提供了正确的长度从第一个提取调用返回。我究竟做错了什么? – zfedsa 2010-07-01 14:37:03

3

这将工作:

std::string utf8; 
uStr.toUTF8String(utf8); 
4

ICU User Guide > 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,但不像上面提到的那样有效或方便。

相关问题