Pregunta

Estoy revisando un código C muy antiguo (10 años). El código se compila en UNIX/Mac con GCC y Compiles Cross para Windows con MINGW. Actualmente hay cadenas TCHAR en todo momento. Me gustaría deshacerme del TCHAR y usar una cadena C ++ en su lugar. ¿Sigue siendo necesario usar las funciones de Windows Wide, o puedo hacer todo ahora con Unicode y UTF-8?

¿Fue útil?

Solución

Windows usa UTF16 aún y probablemente siempre lo hará. Necesitas usar wstring más bien que string por lo tanto. Las API de Windows no ofrecen soporte para UTF8 directamente porque Windows admitió Unicode antes de que se inventara UTF8.

Por lo tanto, es bastante doloroso escribir un código Unicode que se compilará en las plataformas de Windows y UNIX.

Otros consejos

¿Sigue siendo necesario usar las funciones de Windows Wide, o puedo hacer todo ahora con Unicode y UTF-8?

Sí. Desafortunadamente, Windows no tiene soporte nativo para UTF-8. Si desea un soporte de unicode adecuado, debe usar el wchar_t versión de las funciones de la API de Windows, no la char versión.

¿Debo eliminar TCHAR del código de Windows?

Si deberías. La razón TCHAR existe es admitir versiones de Windows tanto de UNICODE como no unicode. El soporte no unicode puede haber sido una preocupación importante en 2001 cuando Windows 98 todavía era popular, pero no hoy.

Y es muy poco probable que cualquier biblioteca no específica de Windows tenga el mismo tipo de char/wchar_t sobrecarga que hace TCHAR usable.

Así que adelante y reemplace todo su TCHARs con wchar_ts.

El código se compila en UNIX/Mac con GCC y Compiles Cross para Windows con MINGW.

He tenido que escribir el código C ++ multiplataforma antes. (Ahora mi trabajo es escribir código C# multiplataforma). La codificación de caracteres es bastante dolorosa cuando Windows no es compatible con UTF-8 y UN*X no es compatible con UTF-16. Terminé usando UTF-8 como nuestra principal codificación y conversión según sea necesario en Windows.

Sí, escribir aplicaciones no unicode hoy en día se está disparando en el pie. Simplemente use la API ancha en todas partes, y no tendrá que llorar por eso más tarde. Todavía puede usar UTF8 en UNIX y WCHAR_T en Windows si no necesita una comunicación (en red) entre plataformas (o convertir los WCHAR_T con la API WIN32 a UTF-8), o ir por la manera difícil y usar UTF-8 en todas partes y convertir a wchar_t cuando usa funciones de API Win32 (eso es lo que hago).

Para responder directamente a su pregunta:

¿Sigue siendo necesario usar las funciones de Windows Wide, o puedo hacer todo ahora con Unicode y UTF-8?

No, (no ASCII) UTF-8 no es aceptado por la gran mayoría de las funciones de la API de Windows. Todavía tienes que usar las API anchas.

Uno podría lamentarse de que otros sistemas operativos aún no tengan apoyo para wchar_t. Por lo tanto, también debe admitir UTF-8.

Las otras respuestas proporcionan buenos consejos sobre cómo administrar esto en una base de código multiplataforma, pero parece que ya tiene una implementación que admite diferentes tipos de caracteres. Tan deseable como desgarrar eso para simplificar el código puede sonar, no lo hagas.

Y predigo que algún día, aunque probablemente no antes del año 2020, Windows agregará soporte UTF-8, simplemente agregando versiones U de todas las funciones de API, junto con A y W, además del mismo tipo de hack de enlazador. Las funciones A de 8 bits son solo una capa de traducción sobre las funciones nativas de W (UTF-16). Apuesto a que podrían generar una capa U semiautomáticamente desde la capa A.

Una vez que han sido molestados, lo suficiente, el tiempo suficiente, sobre su apoyo de unicode 'siglo XX' ...

Todavía logrará hacer que sea incómodo escribir, feo para leer y no portátil de forma predeterminada, utilizando macros cuidadosamente elegidas y configuraciones predeterminadas de Visual Studio.

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