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.de

Este 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.

questionAnswers(1)

yourAnswerToTheQuestion