【问题标题】:Is there an STL string class that properly handles Unicode?是否有正确处理 Unicode 的 STL 字符串类?
【发布时间】:2011-06-19 05:13:49
【问题描述】:

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

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

【问题讨论】:

    标签: c++ unicode stl unicode-string


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,唉,你完全正确地将它纯粹用于字符串。不过我喜欢 qt 并且确实使用了很多 :)
      【解决方案3】:

      对于 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 构造。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是一个不错的小图书馆 :)
        【解决方案5】:

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

        【讨论】:

        • 嗯,我在新标准中没有注意到这一点。很有意思。我不能在缺乏 C++0x 支持的编译器(例如 iPhone 编译器)上使用它,真是太遗憾了。真正让我震惊的是这些课程还不存在......
        • 有趣的是,GCC > 4.4 和 VS2010 似乎都支持它。这是辉煌的。在涵盖windows、linux和Android移动平台的主要平台上。 Clang 还指出“许多”示例都有效......
        • @Goz 并不是所有的事情都像你想象的那么好。 VS2010 支持 unicode 字符串,但不支持 unicode 字符串文字。 u"Hello" 是 UTF-16 字符串文字,U"Hello" 是 UTF-32 文字。 Visual Studio 无法识别它们。而且正如我已经说过的,gcc 还不支持输入、输出流。
        【解决方案6】:

        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;
        }
        

        【讨论】:

        • 虽然它并不是真正的 sropin 替代品 ;) 理想情况下,我希望看到类似 std::string8、std::string16 和 std::string32 ...
        【解决方案7】:

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

        【讨论】:

        • 看起来很有趣。可惜它没有 STL 字符串支持......在这种情况下它会是完美的......
        • 阅读过它,但在使用 DB2 一段时间后,我会在接触任何来自 IBM 的东西之前三思而后行。你用过它吗?好吃吗?
        • @Goz:我完全同意,unicode 已经足够“标准”了,以至于我们希望字符串不仅仅可以存储字节序列...
        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        相关资源
        最近更新 更多