Я пытаюсь написать кодек для Code page 437. Мой план состоял в том, чтобы просто передать символы ASCII и отобразить оставшиеся 128 символов в таблице, используя значение utf-16 в качестве ключа.Как сделать QChar.unicode() сообщать представление utf-16 комбинированных символов?
Для некоторых комбинированных символов (буквы с точками, тильды и т. Д.) Персонаж, похоже, занимает два QChars.
Тестовая программа, которая печатает 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
Пробовал различные нормализации формы avaialable в QString, но ни у кого не было меньше байтов, чем по умолчанию.
Поскольку QChar - это 2 байта, он должен уметь удерживать значение символов выше в одном объекте. Почему QString использует два QChars? Как получить комбинированное значение unicode?
Вы знаете, что 'cout' печатает байты за раз? Сколько двухбайтовых символов вы распечатали? – rubenvb
@rubenvb qs.length() подтверждает, что строка состоит из двух байтов. –
Если кому-то еще нужно написать cp437-кодек, на сайте unicode.org есть [mapping] (ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT). –