UTF-8
es una posible codificación para Unicode. Define 1, 2, 3 o 4 bytes por carácter. Cuando lo lea a través del getwc()
, obtendrá de uno a cuatro bytes y creará un solo carácter Unicode codepoint, que cabría dentro de un wchar
(que puede tener 16 o incluso 32 bits de ancho, dependiendo de la plataforma).
Pero como valores Unicode mapa para todos los valores de 0x0000
a 0xFFFF
, no hay valores de la izquierda para volver códigos de condición o de error en (Algunos han señalado que Unicode es mayor que 16 bits, lo cual es cierto;. En se utilizan esos casos surrogate pairs. Pero el punto aquí es que Unicode utiliza todos los valores disponibles dejando ninguno para EOF.)
varios códigos de error incluyen EOF (WEOF
), que asigna a -1. Si tuviera que poner el valor devuelto de getwc()
en un wchar
, no habría forma de distinguirlo de un carácter Unicode 0xFFFF
(que, por cierto, está reservado de todos modos, pero estoy divagando).
Así que la respuesta es utilizar un más amplio tipo, un wint_t
(o int
), que posee al menos 32 bits. Eso le da a los 16 bits más bajos el valor real, y cualquier cosa con un bit establecido fuera de ese rango significa que sucedió algo diferente a un personaje que regresó.
¿Por qué no siempre usamos wchar
en vez de wint
? La mayoría de las funciones relacionadas con cadenas usan wchar
porque en la mayoría de las plataformas es ½ del tamaño de wint
, por lo que las cadenas tienen una huella de memoria más pequeña.
Un carácter UTF-8 puede tener 4 bytes de longitud, técnico, incluso puede tomar 5 o 6 bytes, pero tales composiciones no son caracteres utf8 válidos. – quinmars
Bueno, cierto. Puede tener 4 bytes de longitud si ingresa a los caracteres de plan adicionales de 0x10000 y superiores, pero eso se convierte en sustitutos cuando se trata de UTF-16, y pensé que estaba fuera del alcance de la pregunta. Y aunque son posibles secuencias de 5 o 6 bytes, siempre se pueden expresar en menos de 5 bytes y solo se generan con serializadores de baja calidad. – lavinio
Su respuesta es en su mayoría correcta, pero usted proporciona demasiados detalles (platofrm depenent). 'wchar_t' es _no_ siempre 16 bits, puedo pensar en al menos 2 combinaciones de OS/compilador donde es 32. –