2010-04-27 23 views
7

En plataformas diferentes a Windows, puede usar fácilmente las cadenas char * y tratarlas como UTF-8.¿Cómo lidiar con cadenas Unicode en C/C++ de una manera compatible con plataformas cruzadas?

El problema es que en Windows debe aceptar y enviar mensajes utilizando wchar * strings (W). Si usará las funciones de ANSI (A) no admitirá Unicode.

Así que si quieres escribir una aplicación realmente portátil, debes compilarla como Unicode en Windows.

Ahora, para mantener el código limpio me gustaría ver cuál es la forma recomendada de tratar con cadenas, una manera de minimizar la fealdad en el código.

Tipo de cuerdas que puede necesitar: std::string, std::wstring, std::tstring, char *, wchat_t *, TCHAR*, CString (ATL uno).

Problemas que pueden surgir:

  • cout/cerr/cin y sus variantes Unicode wcout,wcerr,wcin
  • todas las funciones cambiado el nombre de ancho de cuerda y sus macros TCHAR - como strcmp, wcscmp y _tcscmp.
  • cadenas constantes dentro del código, con TCHAR tendrá que completar su código con _T() macros.

¿Qué enfoque considera que es el mejor? (ejemplos son bienvenidos)

Personalmente, me gustaría un enfoque std::tstring, pero me gustaría ver cómo haría las conversiones donde son necesarios.

+1

http://utf8everywhere.org lo explica todo. –

Respuesta

3

Solo puedo sugerir que compruebe esta biblioteca: http://cppcms.sourceforge.net/boost_locale/docs/
Podría ser de ayuda, es un candidato de impulso por ahora, pero creo que lo conseguirá.

+0

La documentación más reciente se encuentra en http://cppcms.sourceforge.net/boost_locale/html/tutorial.html – Artyom

+0

Gracias :) ¿Cómo va? ¿Ya está hecho? –

+1

funciona bien.Solo espero algunas correcciones en boost-build para hacer que bjam/boost-build pueda encontrar la biblioteca de ICU correctamente y construir boost-locale. – Artyom

1

Puede mantener codificadas todas sus cadenas UTF-8 y simplemente convertirlas a UTF-16 antes de interactuar con la API WIn32. Echar un vistazo a UTF8-CPP biblioteca para algunos fácil de utilizar las funciones de conversión

1

Si la escritura de código portátil:

primera Nunca use wchar_t es ni portátil y su codificación no está bien definida entre las plataformas (UTF-16 ventanas/utf-32 todos los demás).

Nunca use TChar, use el std::string simple codificado como UTF-8.

Cuando se trata de Brain Damaged Win32 API, simplemente convierta la cadena UTF-8 a UTF-16 antes de llamarla.

Vea también https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful cómo el proyecto de Windows adopta UTF-8 como codificación principal.

+1

en visual studio, cuando hago 'std :: string msg =" महसुस ";', no puedo verlo. Y todo es reemplazado por un signo de interrogación. ¿Alguna idea? –

+2

La publicación SO a la que se hace referencia en esta respuesta ahora es un enlace inactivo. Parece que fue una publicación importante ... – Dan

+0

No hay daño cerebral en las ventanas con UTF-16. Windows comenzó a ser compatible con Unicode con Windows NT (lanzado en 1993). UTF-8 sólo se inventó como un concepto en septiembre de 1992 https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt, así que no había manera de Windows podría adoptarlo. De hecho, Windows fue un adoptante temprano altamente progresivo de Unicode, resulta quizás demasiado pronto. –

Cuestiones relacionadas