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