【问题标题】:New unicode characters in C++0xC++0x 中的新 unicode 字符
【发布时间】:2010-10-26 17:28:32
【问题描述】:

我正在构建一个 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&lt;char16_t&gt;std::basic_string&lt;char32_t&gt;的typedef是什么:

    typedef basic_string<wchar_t> wstring.
    

    我找不到任何参考资料。

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

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

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

【问题讨论】:

  • 你似乎无意中恢复了我琐碎的 s/interfer/interfere/ 拼写更正。
  • 谢谢,将您的修复合并回来。

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


【解决方案1】:

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

引用ISO/IEC JTC1 SC22 WG21 N2018:

char16_t 定义为 typedef 独特的新类型,名称 _Char16_tuint_least16_t 具有相同的大小和表示形式。 同样,将char32_t 定义为 typedef 到一个独特的新类型,与 具有相同名称的_Char32_t 大小和表示为 uint_least32_t.

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

您可能想知道为什么 首先需要_Char16_t_Char32_t 类型和关键字 当 typedefs uint_least16_tuint_least32_t 已经可用。 新类型的主要问题 解决的是超载。下雪了 可能重载的功能 取_Char16_t_Char32_t 论据,并创建专业化 如std::basic_string&lt;_Char16_t&gt; 区别于 std::basic_string &lt;wchar_t&gt;.

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

标准库还将提供 _Char16_t_Char32_t typedefs,类似于 typedefs wstringwcout等,用于以下标准类:

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

【讨论】:

  • 非常感谢,这真的很有帮助!
  • 根据标准草案,char16/32_t 是关键字,而不是 typedef。谁是对的?
  • 在 gcc 版本 4.7.3 中,char16_t/char32_t 是关键字。我检查了。您可以定义一个名为 int32_t(它是 typedef)的变量,但不能定义 char32_t(它是一个关键字)。
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 2011-01-24
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多