Procesamiento Unicode en C++
(9)
Aquí hay una lista de verificación para la programación de Windows:
- Todas las cadenas incluidas en _T ("mi cadena")
- funciones strlen () etc. reemplazadas por _tcslen () etc.
- Use LPTSTR y LPCTSTR en lugar de char * y const char *
- Al comenzar nuevos proyectos en Dev Studio, asegúrese religiosamente 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
¿Cuál es la mejor práctica del procesamiento Unicode en C ++?
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 que funciona 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 descarta el código principal, tiene una buena biblioteca para leer / escribir UNICODE.
Como se ha dicho anteriormente, una biblioteca es la mejor opción cuando se usa un sistema grande. Sin embargo, algunas veces quiere 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 ser bueno (ver su respuesta para más detalles).
También encontré otra que tiene un código más pequeño, pero carece de comprobación completa de errores y solo maneja UTF-8, pero fue más fácil de quitar partes.
Aquí hay una lista de las bibliotecas integradas que parecen decentes.
Bibliotecas integradas
- http://code.google.com/p/netwidecc/downloads/list (UTF8, UTF16LE, UTF16BE, UTF32)
- http://www.cprogramming.com/tutorial/unicode.html (UTF8)
- http://utfcpp.sourceforge.net/ (Biblioteca UTF8 simple)
Eche un vistazo a las recomendaciones de UTF-8 en todas partes
Nuestra empresa (y otras) utilizan la biblioteca de código abierto ICU (ICU) desarrollada originalmente por Taligent.
Maneja cadenas, configuraciones regionales, conversiones, fecha / hora, intercalación, transformaciones, et. Alabama.
Comience con la guía de usuario de la ICU
Observe la comparación de cadenas insensibles a mayúsculas / 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 mira en el lado izquierdo del navegador en MSDN al lado de 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ódigo
- Conjuntos 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
Si no le importa la compatibilidad con versiones anteriores de los estándares C ++, el estándar actual C ++ 11 ha incorporado soporte Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3242.pdf
Entonces, la verdadera mejor práctica para el procesamiento de Unicode en C ++ sería usar las instalaciones integradas para ello. Sin embargo, eso no siempre es una posibilidad 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 consciente de Unicode, ya que ahora es compatible con literales Unicode y cadenas Unicode. Sin embargo, la biblioteca estándar solo tiene soporte limitado para el procesamiento y la conversión de Unicode. Para sus necesidades actuales esto puede ser suficiente. Sin embargo, si necesita hacer una gran cantidad de trabajo pesado en este momento, puede que necesite usar algo como la ICU para un procesamiento más profundo. Hay algunas propuestas actualmente en proceso para incluir un soporte más robusto para la conversión de texto entre diferentes codificaciones. Mi suposición (y espero) es que esto será parte del próximo informe técnico .
- Use la ICU para manejar 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 builtins estándar de biblioteca como
is_alpha
menos que esa sea la definición que desee. - No puedo decir lo suficiente: nunca iteres sobre los índices de una
string
si te preocupa la corrección, siempre usa tu biblioteca Unicode para esto.