Недавно натолкнулся на это сообщение:
http://www.sql.ru/forum/actualthread.aspx?tid=867419.
На мой взгляд, это самое толковое объяснение принципа работы с кодировками в Qt. Привожу полный текст сообщения:
QTextCodec - это такая хитрая хрень, в которой хитрости больше, чем смысла.
Хитрость в том, что кодек надо создавать всегда с названием какой-то кодировки, например "cp-1251". Читатель спросит: есть два рубля? а почему одной? А если я хочу перекодировать из cp1251 в Utf-8?
Идея такая: кодек, который вы создаёте с указанием конкретной кодировки, умеет лишь гонять строку между указанной кодировкой и юникодом. Юникод - это не utf-8/utf-32, а жирная 2-байтовая таблица кодов; utf-8 - это не юникод, не надо путать, а только одно из представлений юникода.
Так вот, после того как вы создали кодек (например "cp-1251") он предлагает вам гонять строку в двух направлениях "UNICODE <---> cp1251".
Чтобы засобачить cp1251 в KOI8, вам надо создать два кодека, потом проделать операцию "cp1251 ---> UNICODE ---> KOI8".
У кодека есть две основные операции:
* toUnicode
* fromUnicode
Это и есть два вышеописанных направления. Когда для кодека "cp1251" вы вызываете "toUnicode()" - это направление "cp1251 -> UNICODE", а когда fromUnicode(), то наоборот "UNICODE -> cp1251".
toUnicode() всегда возвращает QString, так как QString - это массив двухбайтовых значений - как раз для переноски юникода.
fromUnicode() всегда возващает массив байт QByteArray, так как направление "из UNICODE в КАКУЮ_ЛИБО_КОДИРОВКУ" предполагает возврат юзеру потенциально диких с точки зрения QString кусков памяти, поэтому проще QByteArray().