Pregunta

Tenemos un conjunto de aplicaciones que se desarrollaron para el conjunto de caracteres ASCII. Ahora, estamos tratando de instalarlo en Islandia, y estamos teniendo problemas donde los caracteres islandeses se están jodiendo.

Estamos trabajando en nuestros problemas, pero me preguntaba: ¿Existe una buena "guía"? ¿Por ahí para escribir código C ++ que está diseñado para caracteres de 8 bits y que funcionará correctamente cuando se le proporcionen datos UTF-8?

No puedo esperar que todos lean el estándar completo de Unicode, pero si hay algo más digerible disponible, me gustaría compartirlo con el equipo para que no volvamos a encontrarnos con estos problemas.

En este momento, no es posible volver a escribir todas las aplicaciones para usar wchar_t o alguna otra representación de cadena. También señalaré que estas aplicaciones se comunican a través de redes con servidores y dispositivos que usan caracteres de 8 bits, por lo que incluso si hiciéramos Unicode internamente, todavía tendríamos problemas con la traducción en los límites. En su mayor parte, estas aplicaciones simplemente pasan datos alrededor; ellos no "procesan" el texto de cualquier otra forma que no sea copiarlo de un lugar a otro.

Los sistemas operativos utilizados son Windows y Linux. Usamos std :: string y cadenas C simples. (Y no me pida que defienda ninguna de las decisiones de diseño. Solo intento ayudar a solucionar el problema).


Aquí hay una lista de lo que se ha sugerido:

¿Fue útil?

Solución

Esto parece una guía rápida completa:
http://www.cl.cam.ac.uk/~mgk25/ unicode.html

Otros consejos

Solo debes estar limpio en 8 bits, en su mayor parte. Sin embargo, deberá tener en cuenta que cualquier carácter que no sea ASCII se divide en varios bytes, por lo que debe tener esto en cuenta si se muestra un texto de corte de línea o truncado.

UTF-8 tiene la ventaja de que siempre puede decir dónde se encuentra en un carácter de múltiples bytes: si el bit 7 está establecido y el bit 6 se restablece (el byte es 0x80-0xBF), este es un byte final, mientras que si los bits 7 y 6 están establecidos y 5 se restablece (0xC0-0xDF) es un byte principal con un byte final; si se establecen 7, 6 y 5 y se restablece 4 (0xE0-0xEF), se trata de un byte inicial con dos bytes finales, y así sucesivamente. El número de bits consecutivos establecidos en el bit más significativo es el número total de bytes que forman el carácter. Es decir:

110x xxxx = carácter de dos bytes
1110 xxxx = carácter de tres bytes
1111 0xxx = carácter de cuatro bytes
etc

El alfabeto islandés está contenido en ISO 8859-1 y, por lo tanto, en Windows-1252. Si se trata de una aplicación de modo de consola, tenga en cuenta que la consola utiliza páginas de códigos de IBM, por lo que (dependiendo de la configuración regional del sistema) podría aparecer en 437, 850, o 861 . Windows no tiene soporte de pantalla nativo para UTF-8; debe transformarse a UTF-16 y usar las API de Unicode.

Llamar a SetConsoleCP y SetConsoleOutputCP, especificando la página de códigos 1252, le ayudará con su problema, si se trata de una aplicación de modo consola. Desafortunadamente, la fuente de la consola seleccionada debe ser una fuente que admita la página de códigos, y no puedo ver una manera de establecer la fuente. Las fuentes de mapa de bits estándar solo admiten la página de códigos OEM predeterminada del sistema.

Tenga en cuenta que Unicode completo no cabe en caracteres de 16 bits; así que use caracteres de 32 bits o codificación de ancho variable (UTF-8 es el más popular).

UTF-8 fue diseñado exactamente con sus problemas en mente. Una cosa de la que debería tener cuidado es que ASCII es realmente una codificación de 7 bits, por lo que si alguna parte de su infraestructura utiliza el octavo bit para otros fines, puede ser complicado.

Es posible que desee revisar icu . Es posible que tengan funciones disponibles que facilitarían el trabajo con cadenas UTF-8.

Icelandic usa ISO Latin 1, por lo que ocho bits deberían ser suficientes. Necesitamos más detalles para descubrir qué está pasando.

El islandés, al igual que el francés, el alemán y la mayoría de los otros idiomas de Europa occidental, puede admitirse usando un conjunto de caracteres de 8 bits (CP1252 en Windows, ISO 8859-1 también conocido como Latin1 en * x). Este fue el enfoque estándar antes de que se inventara Unicode, y todavía es bastante común. Como dice, tiene la restricción de que no puede volver a escribir su aplicación para usar wchar, y no necesita hacerlo.

No debería sorprenderse de que UTF-8 esté causando problemas; UTF-8 codifica los caracteres que no son ASCII (por ejemplo, los caracteres latinos acentuados, thorn, eth, etc.) como DOS BYTOS cada uno.

El único consejo general que se puede dar es bastante simple (en teoría): (1) decida qué conjunto de caracteres va a admitir (Unicode, Latin1, CP1252, ...) en su sistema (2) si se le suministran datos codificados de alguna otra manera (por ejemplo, UTF-8), transcodifíquelos a su estándar (por ejemplo, CP1252) en el borde del sistema (3) si necesita suministrar datos codificados de alguna otra manera, ...

Es posible que desee utilizar caracteres anchos (wchar_t en lugar de char y std :: wstring en lugar de std :: string). Esto no resuelve automáticamente el 100% de sus problemas, pero es un buen primer paso.

También use funciones de cadena que son compatibles con Unicode (consulte la documentación). Si algo manipula caracteres o cadenas anchos, generalmente es consciente de que son anchos.

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