c++ unicode

Unicode-generalmente trabajando con él en C++



(4)

Supongamos que tenemos una cadena arbitraria, s .

s tiene la propiedad de ser de casi cualquier parte del mundo. Personas de Estados Unidos, Japón, Corea, Rusia, China y Grecia escriben en s de vez en cuando. Sin embargo, afortunadamente, no tenemos viajeros en el tiempo usando Linear A.

En aras de la discusión , supongamos que queremos hacer operaciones de cadena como:

  • marcha atrás
  • longitud
  • capitalizar
  • minúscula
  • índice en

y , solo porque esto es por el bien de la discusión, supongamos que queremos escribir estas rutinas nosotros mismos (en lugar de tomar una biblioteca), y no tenemos ningún software heredado que mantener.

Hay 3 estándares para Unicode: utf-8, utf-16 y utf-32, cada uno con sus pros y sus contras. Pero digamos que soy bastante tonto, y quiero que un Unicode los gobierne a todos (ya que rodar una biblioteca que se adapta dinámicamente para 3 tipos diferentes de codificaciones de cadenas que ocultan la diferencia con el usuario de la API parece difícil).

  • ¿Qué codificación es la más general?
  • ¿Qué codificación soporta wchar_t?
  • ¿Qué codificación soporta la STL?
  • ¿Son estas codificaciones todas (o no) terminadas en nulo?

-

El punto de esta pregunta es educarme a mí mismo ya otros en información útil y útil para Unicode: leer las RFC está bien, pero hay una ''pila'' de información relacionada con compiladores, idiomas y sistemas operativos que las RFC no cubren, pero Es vital saber que realmente usas Unicode en una aplicación real.


  1. ¿Qué codificación es la más general?
    Probablemente UTF-32, aunque los tres formatos pueden almacenar cualquier carácter. UTF-32 tiene la propiedad de que cada carácter puede codificarse en un solo punto de código.

  2. Qué codificación soporta wchar_t
    Ninguna. Esa es la implementación definida. En la mayoría de las plataformas de Windows es UTF-16, y en la mayoría de las plataformas Unix es UTF-32.

  3. ¿Qué codificación soporta el STL?
    Ninguno en realidad El STL puede almacenar cualquier tipo de personaje que desee. Simplemente use la plantilla std::basic_string<t> con un tipo lo suficientemente grande como para contener su punto de código. Sin embargo, la mayoría de las operaciones (por ejemplo, std::reverse ) no conocen ningún tipo de codificación Unicode.

  4. ¿Son estas codificaciones todas (o no) terminadas en nulo?
    No. Nulo es un valor legal en cualquiera de esas codificaciones. Técnicamente, NULL también es un personaje legal en ASCII simple. La terminación NULL es una cosa C, no una cosa de codificación.

Elegir cómo hacer esto tiene mucho que ver con su plataforma. Si estás en Windows, usa las cadenas UTF-16 y wchar_t, porque eso es lo que usa la API de Windows para admitir Unicode. No estoy completamente seguro de cuál es la mejor opción para las plataformas UNIX, pero sí sé que la mayoría de ellas usan UTF-8.


Definir "aplicación real" :)

En serio, la decisión realmente depende mucho del tipo de software que estés desarrollando. Si su plataforma de destino es la API de Win32 (con o sin envoltorios como MFC, WTL, etc.) probablemente querrá usar tipos de wstring con el texto codificado como UTF-16. Eso es simplemente porque todas las API de Win32 internamente usan esa codificación de todos modos.

Por otro lado, si su salida es algo como XML / HTML y / o necesita ser entregada a través de Internet, UTF-8 es prácticamente el estándar: generalmente se transmite bien a través de protocolos que hacen suposiciones sobre los caracteres que tienen 8 bits.

En cuanto a UTF-32, no puedo pensar en una sola razón para usarlo, a menos que necesite un mapeo 1: 1 entre unidades de código y puntos de código (¡eso todavía no significa mapeo 1: 1 entre unidades de código y caracteres!).

Para obtener más información, asegúrese de consultar Unicode.org. Estas preguntas frecuentes pueden ser un buen punto de partida.


Eche un vistazo a la ICU biblioteca de código abierto, especialmente en la sección Documentos y documentos . Es una biblioteca extensa que trata con todo tipo de rarezas de Unicode.


En respuesta a su viñeta final, se garantiza que UTF-8 no tiene NULL bytes en su codificación de ningún carácter (excepto NULL en sí, por supuesto). Como resultado, muchas funciones que funcionan con cadenas terminadas en NULL también funcionan con cadenas codificadas en UTF-8.