Я хотел бы скрыть 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"
Похоже, так и должно быть.