c++11 - ¿Forma estándar en C11 y C++ 11 para convertir UTF-8?
unicode character-encoding (1)
C11 y C ++ 11 introducen el uchar.h
/ cuchar
define char16_t
y char32_t
como explícitamente caracteres de 16 y 32 bits de ancho, sintaxis literal añadida u""
y U""
para escribir cadenas con estos tipos de caracteres, junto con las macros __STDC_UTF_16__
y __STDC_UTF_32__
que le dicen si corresponden o no a las unidades de código UTF-16 y UTF-32. Esto ayuda a eliminar la ambigüedad sobre wchar_t
, que en algunas plataformas era de 16 bits y generalmente se usaba para contener unidades de código UTF-16, y en algunas plataformas era de 32 bits y generalmente se usaba para contener unidades de código UTF-32; suponiendo que esas macros estén ahora configuradas, ahora puede escribir código portátil, inequívoco, que se refiera a UTF-16 y UTF-32. __STDC_ISO_10646__
también se puede usar como un proxy para determinar si wchar_t
es capaz de contener los valores UTF-32; si no puede, no se puede suponer necesariamente que contenga UTF-16, pero es probable que sea lo suficientemente similar para ser portátil.
También agregan las funciones mbrtoc16
, mbrtoc32
, c16rtomb
y c32rtomb
para convertir caracteres multibyte y estos tipos. Entre estos y la familia de funciones mbstowcs
existente, es posible traducir entre UTF-16, UTF-32, el juego de caracteres multibyte de la plataforma y el conjunto de caracteres de la plataforma de manera portátil (aunque no necesariamente sin pérdida a menos que la plataforma haya definido conjuntos de caracteres multibyte y anchos son UTF, en particular, parece que estas funciones serán bastante inútiles en Windows, donde la codificación multibyte definida localmente no puede usar más de dos bytes por carácter).
Además, agregaron la sintaxis u8""
para escribir cadenas codificadas literalmente UTF-8. Como UTF-8 es una codificación que es compatible con la mayoría de las funciones que se ocupan de char *
y std::string
, esta es una de las nuevas incorporaciones más útiles.
Sin embargo, parece que no han podido agregar ninguna forma de conversión portátil entre UTF-8, UTF-16 y UTF-32. El mbtoc16
y las funciones relacionadas convierten entre la codificación multibyte definida por la implementación y UTF-16 o 32; pero no puedes depender de que sea UTF-8. En las plataformas tipo Unix depende de la configuración regional, y muchas de ellas usan UTF-8 en su configuración regional de forma predeterminada, e incluso si no es la predeterminada, al menos puede establecer la configuración regional en una configuración regional UTF-8 con el objetivo de conocer ese "multibyte" significa UTF-8. Sin embargo, en Windows, explícitamente no puede usar UTF-8 ni ninguna otra codificación que requiera más de dos bytes para la configuración regional .
¿Me falta algo, o el tipo de cadena UTF-8 no viene acompañado de ninguna forma de convertirlo a los otros tipos de cadenas: multibyte definido por plataforma, char ancho definido por plataforma, UTF-16 o UTF-32? ¿No hay forma de saber si la codificación multibyte de tu sistema es UTF-8? ¿Hay alguna razón por la cual este soporte no fue incluido (específicamente, estoy buscando una justificación o discusión escrita por los comités de estándares de C o C ++, no solo por la especulación)? ¿Se está trabajando para mejorar esta situación? ¿Es probable que mejore en el futuro?
O, ¿es la mejor solución actual, si desea admitir UTF-8 de manera portátil, escribir su propia implementación, obtener una dependencia de la biblioteca o usar funciones específicas de la plataforma como iconv
y MultiByteToWideChar
?
Parece que estás buscando el tipo std :: codecvt . Vea el ejemplo en esa página para el uso.