C++ 0x中的新unicode字符

Art*_*yom 25 c++ unicode c++11 char16-t char32-t

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

  1. 新的C++标准已推出了新的类型char16_t,并char32_t没有这个的sizeof歧义,应在今后的使用,所以我想支持他们为好,但问题是,它们会干扰正常的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
    };
    
    Run Code Online (Sandbox Code Playgroud)

    所以我可以写:

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

    typedef basic_string<wchar_t> wstring.
    
    Run Code Online (Sandbox Code Playgroud)

    我找不到任何参考.

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

    typedef basic_string<char16_t> u16string;
    typedef basic_string<char32_t> u32string;
    
    Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ter 29

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

ISO/IEC JTC1 SC22 WG21 N2018:

定义char16_t为不同新类型的typedef,其名称 _Char16_t具有相同的大小和表示形式uint_least16_t.同样,将define定义char32_t为不同新类型的typedef,其名称_Char32_t具有相同的大小和表示形式 uint_least32_t.

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

您可能想知道为什么 在typedef 和 可用时首先需要_Char16_t_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_t该类型定义类型定义,类似于wstring, wcout等等,以下标准类:

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