【问题标题】:UnicodeString to char* (UTF-8)UnicodeString 到 char* (UTF-8)
【发布时间】:2010-06-30 15:09:29
【问题描述】:

我在 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 并阅读了有关使用转换器的信息,但我仍然感到困惑。任何帮助将非常感激。

【问题讨论】:

    标签: c++ windows utf-8 internationalization icu


    【解决方案1】:

    调用UnicodeString::extract(...) 提取到一个char*,为转换器传递NULL 以获得默认转换器(在您的操作系统将使用的字符集中)。

    【讨论】:

    • 谢谢!这确实有效。我不确定 destCapacity 参数和 UnicodeString 的长度。此代码有效:codepad.org/blaSP0ex 但您会注意到我手动将 UnicodeString 的 .length() 加倍以弥补多字节字符串。如何确保我的 char* dest 中有足够的空间?
    • icu-project.org/apiref/icu4c/… 如果空间不足,它将返回输出字符串所需的长度和 U_BUFFER_OVERFLOW_ERROR 状态。见userguide.icu-project.org/…
    • 谢谢。文档说最好猜测大小,如果存在缓冲区溢出错误,然后使用第一次调用返回的长度再次调用提取函数。我在这里这样做:codepad.org/nyp5yJWB 但第二次调用仍然失败,即使我为它提供了从第一次提取调用返回的正确长度。我做错了什么?
    • 我忘记了 delete[] 而不是 delete,而且我认为我不需要 sizeof(我通常使用 C),但这些都是次要的细节。
    • 没错,但是失败后需要重置错误码。如果错误已经设置,ICU 函数就会退出。 userguide.icu-project.org/design#TOC-Error-Handling
    【解决方案2】:

    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,但不如上述 fromUTF8()/toUTF8()/toUTF8String() 方法高效或方便。

    【讨论】:

      【解决方案3】:

      这将起作用:

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

      【讨论】:

      • 这是一个旧帖子,如您所见。从那时起,我一直在研究gojavastd::string 应该小心,但我不记得 icu 的所有权是什么 uStr
      • @Johnny_D, std::string 始终包含自定义的字符数组。所以,不用担心std::string utf8;,它会破坏字符串数组的自定义副本。
      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2012-06-12
      • 2014-08-14
      相关资源
      最近更新 更多