Procesamiento Unicode en C ++


Respuestas:


81
  • Utilice ICU para tratar con sus datos (o una biblioteca similar)
  • En su propio almacén de datos, asegúrese de que todo esté almacenado en la misma codificación
  • Asegúrese de estar siempre usando su biblioteca Unicode para tareas mundanas como la longitud de la cadena, el estado de las mayúsculas, etc. Nunca use incorporaciones de biblioteca estándar como a is_alphamenos que esa sea la definición que desea.
  • No puedo decirlo lo suficiente: nunca iteres sobre los índices de a stringsi te importa la corrección, siempre usa tu biblioteca Unicode para esto.

A menos que esté tratando stringcomo datos binarios.
Demi

10

Si no le importa la compatibilidad con versiones anteriores de los estándares C ++, el estándar C ++ 11 actual tiene soporte Unicode integrado: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Por lo tanto, la mejor práctica para el procesamiento Unicode en C ++ sería utilizar las instalaciones integradas para ello. Sin embargo, eso no siempre es posible con bases de código más antiguas, ya que el estándar es tan nuevo en la actualidad.

EDITAR: Para aclarar, C ++ 11 es compatible con Unicode, ya que ahora tiene soporte para literales Unicode y cadenas Unicode. Sin embargo, la biblioteca estándar solo tiene soporte limitado para el procesamiento y la conversión Unicode. Para sus necesidades actuales, esto puede ser suficiente. Sin embargo, si necesita hacer una gran cantidad de trabajo pesado en este momento, es posible que deba usar algo como la UCI para un procesamiento más profundo. Actualmente hay algunas propuestas en proceso para incluir un soporte más sólido para la conversión de texto entre diferentes codificaciones. Mi conjetura (y esperanza) es que esto será parte del próximo informe técnico .


Ese enlace a un borrador de documento estándar no es muy útil sin una referencia a una sección particular que describe el "soporte Unicode integrado" que estás discutiendo.
Ben Collins

1
@BenCollins Sección 2.14.5 "Literales de cadena" : analiza los literales de cadena, incluidos los literales de cadena para codificaciones UTF-8, UTF-16 y UTF-32. Sección 22.4.1.4 "Códecvt de plantilla de clase" : analiza la clase de códecvt que se utiliza para convertir entre codificaciones de caracteres (incluidas UTF-8, UTF-16 y UTF-32). Hay más información sobre la compatibilidad con Unicode a lo largo del documento, pero estas parecen ser las secciones más críticas sobre el tema.
Eestrada


5

Aquí hay una lista de verificación para la programación de Windows:

  • Todas las cadenas encerradas en _T ("mi cadena")
  • strlen () etc. funciones reemplazadas con _tcslen () etc.
  • Utilice LPTSTR y LPCTSTR en lugar de char * y const char *
  • Al iniciar nuevos proyectos en Dev Studio, asegúrese de que la opción Unicode esté seleccionada en las propiedades de su proyecto.
  • Para cadenas de C ++, use std :: wstring en lugar de std :: string

11
No utilice cadenas, caracteres y funciones en "T", a menos que desee realizar compilaciones Unicode y ANSI. Si solo tiene la intención de hacer compilaciones Unicode, simplemente haga cosas regulares de caracteres anchos: L "mi cadena ancha" wcslen (L "mi cadena") etc
1800 INFORMACIÓN

De acuerdo, solo use macros _T si desea texto genérico, es decir, la capacidad de codificar tanto para Unicode como para Ascii / MBCS.

1
En caso de que desee utilizar cadenas Unicode y ANSI para C ++, utilice algo como typedef std :: basic_string <TCHAR> tString;
Serge

Ah, sí, siempre lo hago #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif pero me gusta más tu manera Serge.
Adam Pierce

4
Honestamente, creo que UTF16 es un desperdicio, dejar todas las codificaciones en UTF8 es más simple y mucho más compatible con * nix.
chacham15

3

Mire la comparación de cadenas sin distinción entre mayúsculas y minúsculas en C ++

Esa pregunta tiene un enlace a la documentación de Microsoft en Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Si busca en el lado de navegación de la izquierda en MSDN junto a ese artículo, debería encontrar mucha información relacionada con las funciones Unicode. Es parte de un capítulo sobre "Codificación de caracteres" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Tiene las siguientes subsecciones:

  • El modelo de página de códigos
  • Juegos de caracteres de doble byte en Windows
  • Unicode
  • Problemas de compatibilidad en entornos mixtos
  • Conversión de datos Unicode
  • Migración de programas basados ​​en Windows a Unicode
  • Resumen

2

Aunque esta puede no ser la mejor práctica para todos, ¡puede escribir sus propias rutinas C ++ UNICODE si lo desea!

Acabo de terminar de hacerlo durante un fin de semana. Aprendí mucho, aunque no garantizo que esté 100% libre de errores, hice muchas pruebas y parece funcionar correctamente.

Mi código está bajo la nueva licencia BSD y se puede encontrar aquí:

http://code.google.com/p/netwidecc/downloads/list

Se llama WSUCONV y viene con un programa main () de muestra que convierte entre UTF-8, UTF-16 y ASCII estándar. Si tira el código principal, tiene una buena biblioteca para leer / escribir UNICODE.


1

Como se ha dicho anteriormente, una biblioteca es la mejor opción cuando se utiliza un sistema grande. Sin embargo, algunas veces desea manejar las cosas usted mismo (tal vez porque la biblioteca usaría muchos recursos como en un microcontrolador). En este caso, desea una biblioteca simple de la que pueda copiar las partes para las cosas que realmente necesita.

El código de ejemplo de Willow Schlanger parece bueno (consulte su respuesta para obtener más detalles).

También encontré otro que tiene un código más pequeño, pero que carece de verificación completa de errores y solo maneja UTF-8, pero fue más sencillo extraer partes.

Aquí hay una lista de las bibliotecas integradas que parecen decentes.

Bibliotecas integradas



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.