Novos caracteres Unicode em C ++ 0x
Pergunta
Estou buiding uma API que permite-me para ir buscar cordas em várias codificações, incluindo utf8, UTF16, UTF32 e wchar_t (que pode ser UTF32 ou UTF16 de acordo com OS).
-
padrão New C ++ introduziu novos tipos
char16_t
echar32_t
que não têm essa ambiguidade sizeof e deve ser usado no futuro, então eu gostaria de apoiá-los, bem como, mas a questão é, seriam eles interferir comuint16_t
normal,uint32_t
, tiposwchar_t
não permitindo sobrecarga porque eles podem se referir a mesmo tipo?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 };
Então, eu só posso escrever:
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
-
O que é o typedef de
std::basic_string<char16_t>
estd::basic_string<char32_t>
como existe hoje:typedef basic_string<wchar_t> wstring.
Não consigo encontrar qualquer referência.
Edit: de acordo com cabeçalhos de gcc-4.4, que introduziram estes novos tipos:
typedef basic_string<char16_t> u16string; typedef basic_string<char32_t> u32string;
Eu só quero ter certeza de que este é exigência padrão real e não gcc-ismo.
Solução
1) char16_t
e char32_t
haverá novos tipos distintos, de modo a sobrecarga sobre eles será possível.
ISO / IEC JTC1 SC22 WG21 N2018 :
Definir
char16_t
ser um typedef para um novo tipo distinto, com o nome_Char16_t
que tem o mesmo tamanho e representação comouint_least16_t
. Da mesma forma, definirchar32_t
ser um typedef para um novo tipo distinto, com o nome_Char32_t
que tem o mesmo tamanho e representação quantouint_least32_t
.
Mais explicações (a partir de um artigo devx.com " Prepare-se para a Revolução Unicode "):
Você deve estar se perguntando por que o
_Char16_t
e_Char32_t
tipos e palavras-chave são necessários em primeiro lugar quando os typedefsuint_least16_t
euint_least32_t
já estão disponíveis. O principal problema que os novos tipos resolver é a sobrecarga. É neve possível sobrecarregar funções que tomar_Char16_t
e_Char32_t
argumentos e criar especializações tal comostd::basic_string<_Char16_t>
que são distintos destd::basic_string <wchar_t>
.
2) u16string
e u32string
são de fato parte do C ++ 0x e não apenas GCC'isms, como eles são mencionados em vários projectos de documentos padrão . Eles serão incluídos no novo cabeçalho <string>
. Citar o mesmo artigo:
A Biblioteca Padrão também irá fornecer
_Char16_t
e_Char32_t
typedefs, em analogia com owstring
typedefs,wcout
, etc., para as seguintes classes padrão:
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string