Как заставить QChar.unicode() сообщать о представлении объединенных символов в utf-16?
Я пытаюсь написать кодек для кодовой страницы 437. Мой план состоял в том, чтобы просто пропустить символы ASCII и отобразить оставшиеся 128 символов в таблице, используя значение utf-16 в качестве ключа.
Для некоторых комбинированных символов (буквы с точками, тильды и т. Д.) Персонаж, кажется, занимает два QChar.
Тестовая программа, которая печатает значения utf-16 для аргументов программы:
#include <iostream>
#include <QString>
using namespace std;
void print(QString qs)
{
for (QString::iterator it = qs.begin(); it != qs.end(); ++it)
cout << hex << it->unicode() << " ";
cout << "\n";
}
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++)
print(QString::fromStdString(argv[i]));
}
Некоторый вывод:
$ ./utf16 Ç ü é
c3 87
c3 bc
c3 a9
Я ожидал
c387
c3bc
c3a9
Опробовал различные формы нормализации, доступные в QString, но ни у кого не было меньше байтов, чем по умолчанию.
Поскольку QChar составляет 2 байта, он должен иметь возможность хранить значение символов выше в одном объекте. Почему QString использует два QChars? Как я могу получить объединенное значение Unicode?
2 ответа
QString::fromStdString
ожидает строку ASCII и не выполняет никакого декодирования. использованиеfromLocal8Bit
вместо.Ваш ожидаемый результат неверен. Например,
Ç
это U+00C7, поэтому вы должны ожидать C7, а не кодировку UTF-8 C3 87!
Если вы измените main()
как показано ниже, вы получите ожидаемые коды Unicode. Для каждого символа первая строка перечисляет локальную кодировку (здесь: Utf-8), так как fromStdString
по сути не работает и передает все прямо. Во второй строке указан правильно декодированный индекс кодовой точки Unicode.
$ ./utf16 Ç ü é
c3 87
c7
c3 bc
fc
c3 a9
e9
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++) {
print(QString::fromStdString(argv[i]));
print(QString::fromLocal8Bit(argv[i]));
}
}
Просто обойти проблему. Увидеть QApplication
в Юникоде. QApplication::arguments
уже в кодировке UTF-16 для вас с учетом местных соглашений.