He encontrado un problema interesante en Windows 8. Probé que puedo representar caracteres Unicode que están fuera del BMP con cadenas wchar_t *. El siguiente código de prueba produce resultados inesperados para mí:Tamaño de wchar_t * para el par suplente (carácter Unicode fuera de BMP) en Windows
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
int i2 = sizeof(s1); // i2 == 4, because of the terminating '\0' (I guess).
int i3 = sizeof(s2); // i3 == 4, why?
El U + 2008A es el Han character, que está fuera del panel multilingüe binario, por lo que debe ser representado por un par suplente en UTF-16. Lo que significa, si lo entiendo correctamente, que debería estar representado por dos caracteres wchar_t. Así que esperaba que sizeof (s2) fuera 6 (4 para los dos wchar_t-s del par sustituto y 2 para el finalizador \ 0).
¿Por qué es sizeof (s2) == 4? Probé que la cadena s2 se ha construido correctamente, porque la he procesado con DirectWrite y el carácter Han se ha mostrado correctamente.
ACTUALIZACIÓN: Como señaló Naveen, traté de determinar el tamaño de las matrices incorrectamente. En el siguiente código resultado correcto:
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
std::wstring str1 (s1);
std::wstring str2 (s2);
int i2 = str1.size(); // i2 == 1.
int i3 = str2.size(); // i3 == 2, because two wchar_t characters needed for the surrogate pair.
correcta por supuesto, gracias. Sry por la estúpida pregunta ... –
"No tiene nada que ver con el personaje almacenado en s2": como la pregunta fue causada por un malentendido entre los apuntadores y las cosas señaladas, deberías evitar causar otro malentendido como ese. No hay ningún personaje almacenado en s2. En este caso, hay un personaje almacenado en s2 [0] y s2 [1]. Si no fuera un par suplente, entonces habría un carácter almacenado solo en s2 [0], es decir, en * s2. –
@Windowsprogrammer: Solucionado. –