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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сp1251->cp866  (Прочитано 8445 раз)
Ggg_old
Гость
« : Март 23, 2006, 21:24 »

Подскажите пожалуйста наименее бескровный способ проконвертить
QString данные в который заносились из utf8 источника в сp866 char* или QByteArray.

В оригинале у меня строка берется из QSqlQuery запроса, у которого данные в 1251 кодировке. В тестовом примере явно присваивается test1251 и не используется fromLocal8Bit.
Сейчас я не придумал ничего лучше как:
QString test1251="тест\n";
QTextCodec *utf8 = QTextCodec::codecForName("Windows-1251");
QTextCodec *cp866 = QTextCodec::codecForName("IBM 866");

QByteArray ba=test1251.toAscii();   
QString st_utf=utf8->toUnicode(ba);
QByteArray ba866=cp866->fromUnicode(st_utf);
QString st866=ba866;
Т.е используется utf8->utf->cp866. Мне этот способ не нравится из-за множественных копирований.
Записан
Hordi
Гость
« Ответ #1 : Март 23, 2006, 21:50 »

Сделай таблицу перевода 1251-866 и тупо побайтно конверти - проще некуда.
Записан
Вудруф
Гость
« Ответ #2 : Март 24, 2006, 07:59 »

Примеров в Сети - выше крыши, только у большинства из них некорректно переводится буква "ё". Так что я брал готовую таблицу и правил руками. Можно посмотреть ещё таблицы в FAR'е.
Записан
Ggg_old
Гость
« Ответ #3 : Март 24, 2006, 09:11 »

Спасибо. Конвертить самому - это понятно. Я думал, что у QT есть свое решение.
Записан
Shama
Гость
« Ответ #4 : Март 24, 2006, 11:56 »

Писал когда-то такую функцию перекодировки... По таблице... Вечером кину если хочешь...
Записан
Hordi
Гость
« Ответ #5 : Март 24, 2006, 12:08 »

А такую таблицу просто делать - берешь Qt кодеки для каждой кодировки, формируешь байтный массив от 0 до 255 и конвертишь его используя кодек, затем обратно в другую кодировку - получаешь 2 таблицы перекодировки...
Записан
Shama
Гость
« Ответ #6 : Март 24, 2006, 13:25 »

Цитировать

void convert(char * t){
char s[255];
char s2[255];
strcpy(s,t);
strcpy(s2,t);
char win1[]="ижсйемцьыгузтшбюопнкдфщъвялхрэачИЖСЙЕМЦЬЫГУЗТШБЮОПНКДФЩЪВЯЛХРЭАЧ";
char koi1[]="ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю";
for (char i=0; i<=strlen(t); i++){
  for (char k=0; k<=strlen(koi1); k++){
    if ((unsigned char)(s)==(unsigned char)(win1[k])){
     s2=(unsigned char)(koi1[k]);
   };
  };  
 };
 strcpy(t,s2);
};


Перегоняет CP->KOI... чтобы адаптировать под твои нужды просто поменяй массивы... делается просто... набиваешь в Винде русские буковки в текстовый файлик и открываешь ДОС-редактором... )))

Вроде так... Писалось давно без оптимизации и средств Qt ))) нужно было перегонять теги из инфо виндовых mp3-файлов в Линуксе... Так что не обессудь ))

ЗЫ: в место перебора для поиска индекса символа можно (а я думаю и лучше) использовать ассоциативный список (map)... )))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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