Новые символы Юникода в C++0x
Вопрос
Я создаю API, который позволяет мне получать строки в различных кодировках, включая utf8, utf16, utf32 и wchar_t (это может быть utf32 или utf16 в зависимости от ОС).
Новый стандарт 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");
Каковы typedef
std::basic_string<char16_t>
и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-изм.
Решение
1) char16_t
и char32_t
будут отдельные новые типы, поэтому будет возможна их перегрузка.
Цитата из ISO/IEC JTC1 SC22 WG21 N2018:
Определять
char16_t
чтобы быть типичным в отличном новом типе с именем_Char16_t
который имеет тот же размер и представление, что иuint_least16_t
.Аналогично определитеchar32_t
чтобы быть типичным в отличном новом типе с именем_Char32_t
это имеет тот же размер и представление, что иuint_least32_t
.
Дальнейшее объяснение (из статьи на devx.com "Подготовьтесь к революции Unicode"):
Вы, вероятно, задаетесь вопросом, почему
_Char16_t
и_Char32_t
Типы и ключевые слова необходимы в первую очередь, когда typedefsuint_least16_t
иuint_least32_t
уже доступны.Основная проблема, которую решают новые типы, - это перегрузка.Теперь можно перегружать функции, которые принимают_Char16_t
и_Char32_t
аргументы и создавать специализации, такие какstd::basic_string<_Char16_t>
которые отличаются отstd::basic_string <wchar_t>
.
2) u16string
и u32string
действительно являются частью C++0x, а не просто GCC-измами, как они упоминаются в различные стандартные проекты документов.Они будут включены в новый <string>
заголовок.Цитата из той же статьи:
Стандартная библиотека также предоставит
_Char16_t
и_Char32_t
typedefs, по аналогии с typedefswstring
,wcout
, и т. д. для следующих стандартных классов:
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string