Converta QString em QByteArray com codificação UTF-8 ou Latin1
Gostaria de converter um QString em um QByteArray utf8 ou latin1, mas hoje recebo tudo como utf8.
E estou testando isso com algum caractere no segmento mais alto do latin1 maior que 0x7f, onde o ü alemão é um bom exempl
Se eu fizer assim:
QString name("\u00fc"); // U+00FC = ü
QByteArray utf8;
utf8.append(name);
qDebug() << "utf8" << name << utf8.toHex();
QByteArray latin1;
latin1.append(name.toLatin1());
qDebug() << "Latin1" << name << latin1.toHex();
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-1");
QByteArray encodedString = codec->fromUnicode(name);
qDebug() << "ISO 8859-1" << name << encodedString.toHex();
Recebo a seguinte saída.
utf8 "ü" "c3bc"
Latin1 "ü" "c3bc"
ISO 8859-1 "ü" "c3bc"
omo você pode ver, recebo o unicode 0xc3bc em todos os lugares, onde esperaria obter o Latin1 0xfc para as etapas 2 e
Meu palpite é que eu deveria ter algo assim:
utf8 "ü" "c3bc"
Latin1 "ü" "fc"
ISO 8859-1 "ü" "fc"
O que está acontecendo aqui
/Obrigad
Links para algumas tabelas de caracteres:
http: //www.utoronto.ca/web/HTMLdocs/NewHTML/iso_table.htmhttp: //www.utf8-zeichentabelle.deEste código foi criado e executado em um sistema baseado no Ubuntu 10.0
$> uname -a
Linux frog 2.6.32-28-generic-pae #55-Ubuntu SMP Mon Jan 10 22:34:08 UTC 2011 i686 GNU/Linux
$> env | grep LANG
LANG=en_US.utf8
gt; uname -a
Linux frog 2.6.32-28-generic-pae #55-Ubuntu SMP Mon Jan 10 22:34:08 UTC 2011 i686 GNU/Linux
$> uname -a
Linux frog 2.6.32-28-generic-pae #55-Ubuntu SMP Mon Jan 10 22:34:08 UTC 2011 i686 GNU/Linux
$> env | grep LANG
LANG=en_US.utf8
gt; env | grep LANG
LANG=en_US.utf8
E se eu tentar usar
utf8.append(name.toUtf8());
Recebo esta saída
utf8 "ü" "c383c2bc"
Latin1 "ü" "c3bc"
ISO 8859-1 "ü" "c3bc"
Então, o latin1 é unicode e o utf8 é codificado duas vezes ...
Isso deve depender de algumas configurações do sistema?
Se eu executar isso (não foi possível obter o .name () para compilar)
qDebug() << "system name:" << QLocale::system().name();
qDebug() << "codecForCStrings:" << QTextCodec::codecForCStrings();
qDebug() << "codecForLocale:" << QTextCodec::codecForLocale()->name();
Então eu recebo isso:
system name: "en_US"
codecForCStrings: 0x0
codecForLocale: "System"
Soluçã
Se eu especificar que é UTF-8 que estou usando, para que as diferentes classes saibam disso, ele funcionar
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
qDebug() << "system name:" << QLocale::system().name();
qDebug() << "codecForCStrings:" << QTextCodec::codecForCStrings()->name();
qDebug() << "codecForLocale:" << QTextCodec::codecForLocale()->name();
QString name("\u00fc");
QByteArray utf8;
utf8.append(name);
qDebug() << "utf8" << name << utf8.toHex();
QByteArray latin1;
latin1.append(name.toLatin1());
qDebug() << "Latin1" << name << latin1.toHex();
QTextCodec *codec = QTextCodec::codecForName("latin1");
QByteArray encodedString = codec->fromUnicode(name);
qDebug() << "ISO 8859-1" << name << encodedString.toHex();
Então eu recebo esta saída:
system name: "en_US"
codecForCStrings: "UTF-8"
codecForLocale: "UTF-8"
utf8 "ü" "c3bc"
Latin1 "ü" "fc"
ISO 8859-1 "ü" "fc"
E parece que deveria.