Russian Qt Forum

Qt => Общие вопросы => Тема начата: andrew.k от Июль 04, 2011, 15:51



Название: из одной кодировки в другую (РЕШЕНО)
Отправлено: andrew.k от Июль 04, 2011, 15:51
Подскажите как получить строку, например, в кодировке CP1251. Если у меня setCodecForCStrings( "KOI8-R" ) и все исходники тоже в кои.
Не могу никак врубиться, на выходе все время получаются вопросики.
Нужно что-то вроде.

Код
C++ (Qt)
QString test = "Русский текст";
QTextCodec * codec = QTextCodec::codecForName( "CP1251" );
...
QByteArray result; // test но уже в кодировке CP1251.


Название: Re: из одной кодировки в другую
Отправлено: kambala от Июль 04, 2011, 16:31
Цитата: Assistant
QTextCodecs can be used as follows to convert some locally encoded string to Unicode. Suppose you have some string encoded in Russian KOI8-R encoding, and want to convert it to Unicode. The simple way to do it is like this:
 
Код
C++ (Qt)
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
не подходит?


Название: Re: из одной кодировки в другую
Отправлено: andrew.k от Июль 04, 2011, 17:56
Не подходит. Проблема была в другом на самом деле.
А делается так. Из кодировки КОИ в 1251.

Возможны синтаксические ошибки :)
Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName( "KOI8-R" );
QTextCodec *codec1 = QTextCodec::codecForName( "CP1251" );
QByteArray text = "sometext";
text = codec->toUnicode( text );
text = codec1->fromUnicode( text );
 


Название: Re: из одной кодировки в другую (РЕШЕНО)
Отправлено: sergek от Октябрь 16, 2011, 12:58
Недавно натолкнулся на это сообщение: http://www.sql.ru/forum/actualthread.aspx?tid=867419 (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().