13

我对 std::string 和 std::wstring 了如指掌,但他们似乎并没有完全关注 UTF-8 和 UTF-16 的扩展字符编码(至少在 Windows 上)。也不支持 UTF-32。

那么有人知道提供完整 UTF-8、UTF-16 和 UTF-32 支持的跨平台插入式替换类吗?

4

7 回答 7

11

并且不要忘记轻量级、非常用户友好、仅包含标头的 UTF-8 库UTF8-CPP。不是直接替代品,但可以很容易地结合使用std::string并且没有外部依赖项。

于 2011-02-01T13:18:38.740 回答
9

那么在 C++0x 中有 std::u32string 和 std::u16string 类。GCC 已经部分支持它们,因此您已经可以使用它们,但是对 unicode 的流支持尚未完成C++0x 中的 Unicode 支持

于 2011-02-01T12:01:29.927 回答
7

它不是 STL,但如果你想在 C++ 中使用正确的 Unicode,那么你应该看看ICU

于 2011-02-01T11:35:27.050 回答
3

STL 上不支持 UTF-8。作为替代方案,您可以使用boost codecvt

//...
// My encoding type
typedef wchar_t ucs4_t;

std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

// Set a New global locale
std::locale::global(utf8_locale);

// Send the UCS-4 data out, converting to UTF-8
{
    std::wstringstream oss;
    oss.imbue(utf8_locale);
    std::copy(ucs4_data.begin(),ucs4_data.end(),
        std::ostream_iterator<ucs4_t,ucs4_t>(oss));

    std::wcout << oss.str() << std::endl;
}
于 2011-02-01T11:39:09.027 回答
2

对于 UTF-8 支持,有Glib::ustring类。它是仿照的,std::string但支持 utf-8,例如,当您使用迭代器扫描字符串时。它也有一些限制,例如迭代器总是const,因为替换一个字符可以改变字符串的长度,因此它可以使其他迭代器失效。

ustring不会自动将其他编码转换为 utf-8,Glib库为此提供了各种转换功能 。不过,您可以验证字符串是否是有效的 utf-8。

而且,ustringandstd::string是可以互换的,即ustring有一个转换运算符到 std::string,所以你可以将 austring作为参数传递给std::string预期 an 的地方,当然反之亦然,因为ustring可以从std::string.

于 2011-02-01T13:07:19.897 回答
2

Qt有 QString,它在内部使用 UTF-16,但有转换为 std::wstring、UTF-8、Latin1 或语言环境编码的方法。还有一个 QTextCodec 类,它可以将 QStrings 转换为基本上任何东西。但是对我来说,仅将 Qt 用于字符串似乎有点过头了。

于 2011-02-01T14:20:42.507 回答
1

另请查看http://grigory.info/UTF8Strings.About.html它是 UTF8 原生的。

于 2013-02-13T16:39:07.860 回答