Pregunta

¿Cuál es la mejor práctica de procesamiento Unicode en C++?

¿Fue útil?

Solución

  • Usar UCI para tratar 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 utilizar siempre su biblioteca Unicode para tareas mundanas como la longitud de la cadena, el estado de las mayúsculas, etc.Nunca utilice funciones integradas de biblioteca estándar como is_alpha a menos que esa sea la definición que desea.
  • No puedo decirlo lo suficiente: nunca iterar sobre los índices de un string Si le importa la corrección, utilice siempre su biblioteca Unicode para esto.

Otros consejos

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

Entonces, la verdadera mejor práctica para el procesamiento Unicode en C++ sería utilizar las funciones 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 porque ahora admite literales Unicode y cadenas Unicode.Sin embargo, la biblioteca estándar sólo tiene soporte limitado para procesamiento y conversión Unicode.Para sus necesidades actuales esto puede ser suficiente.Sin embargo, si necesita levantar una gran cantidad de peso en este momento, es posible que aún necesite usar algo como UCI para un procesamiento más profundo.Hay algunas propuestas actualmente en las obras para incluir un soporte más sólido para la conversión de texto entre diferentes codificaciones.Supongo (y espero) que esto sea parte del próximo reporte técnico.

Nuestra empresa (y otras) utilizan el código abierto. Componentes internacionales para Unicode (UCI) desarrollada originalmente por Taligent.

Maneja cadenas, configuraciones regionales, conversiones, fechas/horas, intercalación, transformaciones, etc.Alabama.

Comience con el Guía del usuario de la UCI

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 religiosamente de que la opción Unicode esté seleccionada en las propiedades de su proyecto.
  • Para cadenas C++, use std::wstring en lugar de std::string

Mira aComparación de cadenas que no distingue entre mayúsculas y minúsculas en C++

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

Si busca en el lado de navegación izquierdo de 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
  • Unicódigo
  • Problemas de compatibilidad en entornos mixtos
  • Conversión de datos Unicode
  • Migrar programas basados ​​en Windows a Unicode
  • Resumen

Aunque puede que esta no sea la mejor práctica para todos, ¡puedes escribir tus propias rutinas UNICODE en C++ si lo deseas!

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 descarta el código principal, tendrá una buena biblioteca para leer/escribir UNICODE.

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 utilizaría muchos recursos, como en un microcontrolador).En este caso, desea una biblioteca simple de la que pueda copiar las partes de 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 carece de verificación completa de errores y solo maneja UTF-8, pero era más sencillo quitarle partes.

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

Bibliotecas integradas

Echa un vistazo a las recomendaciones de UTF-8 en todas partes

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top