Как заставить 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 ответа

Решение
  1. QString::fromStdString ожидает строку ASCII и не выполняет никакого декодирования. использование fromLocal8Bit вместо.

  2. Ваш ожидаемый результат неверен. Например, Ç это 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 для вас с учетом местных соглашений.

Другие вопросы по тегам