是否有正确处理Unicode的STL字符串类?

时间:2011-02-01 11:28:56

标签: c++ unicode stl unicode-string

我知道关于std :: string和std :: wstring的所有内容,但它们似乎并没有完全注意UTF-8和UTF-16的扩展字符编码(至少在Windows上)。也不支持UTF-32。

那么有没有人知道提供完整的UTF-8,UTF-16和UTF-32支持的跨平台替代类?

7 个答案:

答案 0 :(得分:11)

让我们不要忘记轻量级,非常用户友好,仅限标头的UTF-8库UTF8-CPP。不是替代品,但可以轻松地与std::string一起使用,并且没有外部依赖性。

答案 1 :(得分:9)

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

答案 2 :(得分:7)

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

答案 3 :(得分: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;
}

答案 4 :(得分:2)

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

ustring不会自动将其他编码转换为utf-8,Glib库具有各种conversion functions。您可以验证字符串是否是有效的utf-8。

而且,ustringstd::string是可以互换的,即ustring有一个强制转换操作符到std :: string,因此您可以将ustring作为参数传递给预计会std::string,反之亦然,因为ustring可以从std::string构建。

答案 5 :(得分:2)

Qt具有在内部使用UTF-16的QString,但具有转换为std :: wstring,UTF-8,Latin1或locale编码的方法。还有QTextCodec类,它可以将QStrings转换为基本上任何东西。但是使用Qt只是字符串似乎对我来说太过分了。

答案 6 :(得分:1)

另请注意http://grigory.info/UTF8Strings.About.html它是原生UTF8。