2011-03-13 9 views
7

Mi proyecto C++ actualmente tiene unas 16K líneas de código grande, y admito que en primer lugar no había pensado completamente en el soporte Unicode.C++: Haciendo que mi proyecto sea compatible con unicode

Todo lo que he hecho era un typedef personalizado para std::string como String y saltar en la codificación.

Nunca he trabajado realmente con unicode en los programas que escribí.

  • ¿Qué tan difícil es cambiar mi proyecto a unicode ahora? ¿Es incluso una buena idea?

  • ¿Puedo cambiar a std::wchar sin ningún problema importante?

+2

std :: wchar no es equivalente a unicode. – Erik

+0

@Erik: Ahora, si Microsoft cambiara su documentación para reflejar que ... – dan04

Respuesta

7

Probablemente la parte más importante de hacer una aplicación Unicode de cuenta es realizar un seguimiento de la codificación de las cadenas y para asegurarse de que sus interfaces públicas están bien especificados y fácil de usar con las codificaciones que desea utilizar.

Cambiar a un carácter más ancho (en C++ wchar_t) no es necesariamente la solución correcta. De hecho, yo diría que generalmente no es la solución más simple. Algunas aplicaciones pueden salirse con la suya especificando que todas las cadenas e interfaces usan UTF-8 y no necesitan cambiar en absoluto. std::string se puede usar perfectamente para cadenas codificadas UTF-8.

Sin embargo, si necesita interpretar los caracteres en una cadena o interfaz con interfaces que no sean UTF-8, tendrá que trabajar más pero, sin saber más acerca de su aplicación, es imposible recomendar el mejor enfoque. .

2

Hay algunos problemas con el uso de std::wstring. Si su aplicación almacenará texto en Unicode y se ejecutará en diferentes plataformas, puede tener problemas. std::wstring se basa en wchar_t, que depende del compilador. En Microsoft Visual C++, este tipo tiene 16 bits de ancho y, por lo tanto, solo es compatible con las codificaciones UTF-16. El compilador GNU C++ especifica que este tipo tiene 32 bits de ancho y, por lo tanto, solo admitirá codificaciones UTF-32. Si luego almacena el texto en un archivo de un sistema (digamos Windows/VC++), y luego lee el archivo de otro sistema (Linux/GCC), tendrá que prepararse para esto (en este caso, conviértalo de UTF-16 a UTF-32).

+0

"este tipo tiene 16 bits de ancho, y por lo tanto solo admitirá codificaciones UTF-16". Esto es incorrecto. A diferencia del ancho fijo de 16 bits, UTF-16 * does * admite puntos de código superiores a 2^16. –

+0

No estoy hablando de puntos de código, estoy hablando de la codificación de puntos de código. Creo que estás confundiendo UTF-16 con UCS-2. Si no, no sé de qué estás hablando. –

+0

Malo, no entendí lo que quería decir con 'solo soporta codificaciones UTF-16'. –

1

¿Puedo cambiar a [std::wchar_t] sin ningún problema importante?

No, no es tan simple.

  • La codificación de una cadena wchar_t depende de la plataforma. Windows usa UTF-16. Linux generalmente usa UTF-32. (C++ 0x atenuará esta diferencia introduciendo tipos de char16_t y char32_t).
  • Si necesita admitir sistemas de tipo Unix, no tiene todas las funciones UTF-16 que tiene Windows, por lo que tenía necesita escribir su propio _wfopen, etc.
  • ¿Utiliza alguna biblioteca de terceros? ¿ellos ayuda wchar_t?
  • Aunque caracteres anchos son comúnmente utilizados para una representación en memoria, en disco y on-the-Web formatos son mucho más probabilidades de ser UTF-8 (u otro char codificación basado) que UTF-16/32. Tendría que convertir estos.
  • No se puede buscar y reemplazar char con wchar_t porque C++ confunde "carácter" y "bytes", y hay que determinar qué char s son los personajes y lo que char s son bytes.
Cuestiones relacionadas