Преобразование QString в QByteArray с кодировкой UTF-8 или Latin1

Я хотел бы скрыть QString в utf8 или latin1 QByteArray, но сегодня я получил все как utf8.

И я тестирую это с помощью некоторых символов в верхнем сегменте latin1 выше 0x7f, где немецкий ü является хорошим примером.

Если мне это нравится:

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();

Я получаю следующий результат.

utf8 "ü" "c3bc" 
Latin1 "ü" "c3bc" 
ISO 8859-1 "ü" "c3bc" 

Как видите, я везде получаю unicode 0xc3bc, где я ожидал бы получить Latin1 0xfc для шагов 2 и 3.

Я предполагаю, что я должен получить что-то вроде этого:

utf8 "ü" "c3bc" 
Latin1 "ü" "fc" 
ISO 8859-1 "ü" "fc" 

Что происходит здесь?

/ Спасибо


Ссылки на некоторые таблицы символов:


Этот код был собран и выполнен в системе на основе Ubuntu 10.04.

$> 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

И если я попытаюсь использовать

utf8.append(name.toUtf8());

, я получу этот вывод

utf8 "ü" "c383c2bc" 
Latin1 "ü" "c3bc" 
ISO 8859-1 "ü" "c3bc" 

Итак, latin1 - это юникод, а utf8 - двойное кодирование ...

Это должно зависеть от некоторых системных настроек?


Если я запустил это (не удалось получить .name () для сборки)

qDebug() << "system name:"      << QLocale::system().name();
qDebug() << "codecForCStrings:" << QTextCodec::codecForCStrings();
qDebug() << "codecForLocale:"   << QTextCodec::codecForLocale()->name();

Затем я получаю следующее:

system name: "en_US" 
codecForCStrings: 0x0 
codecForLocale: "System" 

Решение

Если я укажу, что это UTF-8, я использую, чтобы различные классы знали об этом, {{ 1}} тогда он работает.

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();

Затем я получаю такой вывод:

system name: "en_US" 
codecForCStrings: "UTF-8" 
codecForLocale: "UTF-8" 
utf8 "ü" "c3bc" 
Latin1 "ü" "fc" 
ISO 8859-1 "ü" "fc" 

Похоже, так и должно быть.

6
задан Johan 13 March 2011 в 12:55
поделиться