Russian Qt Forum
Январь 29, 2020, 22:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: из одной кодировки в другую (РЕШЕНО)  (Прочитано 12178 раз)
andrew.k
Гуру общения
******
Offline Offline

Сообщений: 1567


*ерес - местный сумасшедший


Просмотр профиля
« : Июль 04, 2011, 15:51 »

Подскажите как получить строку, например, в кодировке CP1251. Если у меня setCodecForCStrings( "KOI8-R" ) и все исходники тоже в кои.
Не могу никак врубиться, на выходе все время получаются вопросики.
Нужно что-то вроде.

Код
C++ (Qt)
QString test = "Русский текст";
QTextCodec * codec = QTextCodec::codecForName( "CP1251" );
...
QByteArray result; // test но уже в кодировке CP1251.
« Последнее редактирование: Июль 04, 2011, 17:56 от andrew.k » Записан

"Вообще он что должен делать мне неясно и вотому что можно сделать тоже не могу." (С) Верес
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4124



Просмотр профиля WWW
« Ответ #1 : Июль 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);
не подходит?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гуру общения
******
Offline Offline

Сообщений: 1567


*ерес - местный сумасшедший


Просмотр профиля
« Ответ #2 : Июль 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 );
 
Записан

"Вообще он что должен делать мне неясно и вотому что можно сделать тоже не могу." (С) Верес
sergek
Хакер
*****
Offline Offline

Сообщений: 647


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #3 : Октябрь 16, 2011, 12:58 »

Недавно натолкнулся на это сообщение: 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().
« Последнее редактирование: Октябрь 16, 2011, 19:33 от sergek » Записан

Qt 5.13.0 Qt Creator 4.11.0
Win7, Win10, Ubuntu 18.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.107 секунд. Запросов: 22.