C ++ 0x中的新unicode字符

时间:2009-05-16 14:06:09

标签: c++ unicode c++11 char16-t char32-t

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

  1. 新的C ++标准引入了新类型char16_tchar32_t,它们没有这种模糊性,应该在将来使用,所以我也想支持它们,但是问题是,是否会干扰与普通uint16_tuint32_twchar_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>std::basic_string<char32_t>的typedef:

    typedef basic_string<wchar_t> wstring.
    

    我找不到任何参考。

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

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

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

1 个答案:

答案 0 :(得分:30)

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

引自ISO/IEC JTC1 SC22 WG21 N2018

  

char16_t定义为a的typedef   不同的新类型,名称   与_Char16_t具有相同大小和代表的uint_least16_t。   同样,将char32_t定义为a   typedef到一个不同的新类型,有   名称_Char32_t具有相同的名称   大小和表示为   uint_least32_t

进一步解释(来自devx.com文章“Prepare Yourself for the Unicode Revolution”):

  

你可能想知道为什么   首先需要_Char16_t_Char32_t类型和关键字   当typedef uint_least16_t和   uint_least32_t已经可用。   新类型的主要问题   解决就是超载。下雪了   可能超载的功能   采取_Char16_t_Char32_t   参数,并创建专业化   例如std::basic_string<_Char16_t>   与...截然不同   std::basic_string <wchar_t>

2)u16stringu32string确实是C ++ 0x的一部分而不仅仅是GCC的主题,正如various standard draft papers中提到的那样。它们将包含在新的<string>标题中。引自同一篇文章:

  

标准图书馆也将提供   类似于typedef _Char16_t的{​​{1}}和_Char32_t typedef,   wstring等,适用于以下标准类:

     

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