25

我正在构建一个 API,它允许我获取各种编码的字符串,包括 utf8、utf16、utf32 和 wchar_t(根据操作系统可能是 utf32 或 utf16)。

  1. 新的 C++ 标准引入了新类型char16_t,并且char32_t没有这种大小的歧义,应该在将来使用,所以我也想支持它们,但问题是,它们是否会干扰正常uint16_t的 , uint32_t,wchar_t类型不允许重载,因为它们可能指的是同一类型?

    class some_class {
    public:
        void set(std::string); // utf8 string
        void set(std::wstring); // wchar string utf16 or utf32 according
                                 // to sizeof(wchar_t)
        void set(std::basic_string<uint16_t>)
                             // wchar independent utf16 string
        void set(std::basic_string<uint32_t>);
                             // wchar independent utf32 string
    
    #ifdef HAVE_NEW_UNICODE_CHARRECTERS
        void set(std::basic_string<char16_t>)
                             // new standard utf16 string
        void set(std::basic_string<char32_t>);
                             // new standard utf32 string
    #endif
    };
    

    所以我可以写:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. std::basic_string<char16_t>今天的typedef 是什么std::basic_string<char32_t>

    typedef basic_string<wchar_t> wstring.
    

    我找不到任何参考。

    编辑:根据 gcc-4.4 的标题,介绍了这些新类型:

    typedef basic_string<char16_t> u16string;
    typedef basic_string<char32_t> u32string;
    

    我只是想确保这是实际的标准要求,而不是 gcc-ism。

4

1 回答 1

28

1)char16_t并且char32_t将是不同的新类型,因此可以对它们进行重载。

引自ISO/IEC JTC1 SC22 WG21 N2018

定义char16_t为一个不同的新类型的 typedef,其名称 _Char16_tuint_least16_t. 同样,定义char32_t为一个不同的新类型的 typedef,其名称_Char32_tuint_least32_t.

进一步解释(来自 devx.com 文章“为 Unicode 革命做好准备”):

您可能想知道 当 typedef和 已经可用时,为什么首先需要_Char16_tand_Char32_t类型和关键字。新类型解决的主要问题是重载。现在可以重载接受和 参数的函数,并创建 不同于 .uint_least16_tuint_least32_t_Char16_t_Char32_tstd::basic_string<_Char16_t>std::basic_string <wchar_t>

2)u16string并且u32string确实是 C++0x 的一部分,而不仅仅是 GCC 主义,正如各种标准草案文件中提到的那样。它们将包含在新<string>标题中。引用同一篇文章:

标准库还将为以下标准类提供 _Char16_t_Char32_ttypedefs 类似的 typedefswstringwcout

filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream, string

于 2009-05-16T14:30:20.960 回答