2012-06-11 2 views
2

Я пытаюсь написать кодек для 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?

+0

Вы знаете, что 'cout' печатает байты за раз? Сколько двухбайтовых символов вы распечатали? – rubenvb

+0

@rubenvb qs.length() подтверждает, что строка состоит из двух байтов. –

+1

Если кому-то еще нужно написать cp437-кодек, на сайте unicode.org есть [mapping] (ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT). –

ответ

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

  2. Ваш ожидаемый результат неправильный. Например, Ç является U + 00C7, поэтому вы должны ожидать, что C7, не кодировка UTF-8 C3 87!

Если вы изменяете main(), как показано ниже, вы получаете ожидаемые коды кода Юникода. Для каждого символа первая строка содержит локальную кодировку (здесь: Utf-8), так как fromStdString по существу является не-оператором и передает все прямо. Во второй строке показан правильно декодированный индекс кодовой строки Юникода.

$ ./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])); 
    } 
} 
+0

Ах. 1 был вызван неправильным представлением, в котором у меня сложилось впечатление, что (документы довольно ясны), что QString попытается интерпретировать кодировку. Это [на самом деле не выполняется последовательным образом] (http://blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx) 2. Я думал, что QChar :: unicode() возвращает фактическое представление байта, а не коды. Это решает мою проблему и делает небольшой шаг вперед против просвещения Юникода. Я подожду, пока не появится что-нибудь полезное. (Некоторые люди обычно не нажимают на разрешенные вопросы). –

+1

Что еще вы хотите знать?QString встроен в UTF-16, и он не делает никакого кодирования или декодирования - представьте себе, насколько плохо было бы иметь дело с кодированием каждый раз, когда вы пытаетесь работать с строками! –

+1

Как вы ожидаете 'QChar :: unicode()' возвращать "фактическое представление байта"? Пока вы не знаете кодировку, байт не отображается. Итак, я спрашиваю, как QChar божественный кодирования вы ожидаете? QChar представляет кодировки Unicode. Кодирование - это совсем другое дело, и его обрабатывает 'QTextCodec'. –

0

Просто обойти эту проблему. См. QApplication in Unicode. QApplication::arguments уже кодируется UTF-16 для вас, принимая во внимание местные соглашения.

Смежные вопросы