2011-01-31 19 views
12

Esto puede sonar como una pregunta obvia, pero me falta algo sobre cómo está codificado UTF-8 o cómo funciona la función toUtf8.¿Qué está haciendo QString :: toUtf8?

Veamos un programa muy simple

QString str("Müller"); 
qDebug() << str << str.toUtf8().toHex(); 

entonces consigo la salida

"Müller" "4dc383c2bc6c6c6572" 

pero me dio la idea de la del letter ü debería haber sido codificado como c3bc y no c383c2bc.

Gracias Johan

+0

http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante

Respuesta

17

Depende de la codificación de su código fuente.

Tiendo a pensar que su archivo ya está codificado en UTF-8, el carácter ü está codificado como C3 BC.

Está llamando al constructor QString::QString (const char * str) que, de acuerdo con http://doc.qt.io/qt-4.8/qstring.html#QString-8, convierte la cadena en unicode utilizando el método QString :: fromAscii() que considera por defecto la entrada como contenido Latin1.

Como C3 y BC son ambos válidos en latín 1, representando respectivamente & Atilde; y & frac14; convertirlos a UTF-8 dará lugar a los siguientes caracteres:

& Atilde; (C3) -> C3 83

& frac14; (BC) -> C2 BC

que conduce a la cadena que se obtiene: "4d c3 c2 83 aC 6c 6c 65 72"

Para acabar, es doble codificación UTF-8.

Hay varias opciones para resolver este problema:

1) Puede convertir el archivo de origen de América-1 con su editor de texto favorito.

2) Puede escaparse correctamente del carácter ü en \ xFC en la cadena litteral, por lo que la cadena no dependerá de la codificación del archivo.

3) se puede mantener el archivo y la cadena como UTF-8 y utilizar los datos QString str = QString::fromUtf8 ("Müller");

actualización: Este problema ya no es relevante en QT5. http://doc.qt.io/qt-5/qstring.html#QString-8 indica que el constructor ahora usa QString::fromUtf8() internamente en lugar de QString::fromAscii(). Entonces, siempre que la codificación UTF-8 se use consistentemente, se usará de forma predeterminada.

Cuestiones relacionadas