Russian Qt Forum

Qt => Общие вопросы => Тема начата: Ggg_old от Март 23, 2006, 21:24



Название: сp1251->cp866
Отправлено: 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. Мне этот способ не нравится из-за множественных копирований.


Название: сp1251->cp866
Отправлено: Hordi от Март 23, 2006, 21:50
Сделай таблицу перевода 1251-866 и тупо побайтно конверти - проще некуда.


Название: сp1251->cp866
Отправлено: Вудруф от Март 24, 2006, 07:59
Примеров в Сети - выше крыши, только у большинства из них некорректно переводится буква "ё". Так что я брал готовую таблицу и правил руками. Можно посмотреть ещё таблицы в FAR'е.


Название: сp1251->cp866
Отправлено: Ggg_old от Март 24, 2006, 09:11
Спасибо. Конвертить самому - это понятно. Я думал, что у QT есть свое решение.


Название: сp1251->cp866
Отправлено: Shama от Март 24, 2006, 11:56
Писал когда-то такую функцию перекодировки... По таблице... Вечером кину если хочешь...


Название: сp1251->cp866
Отправлено: Hordi от Март 24, 2006, 12:08
А такую таблицу просто делать - берешь Qt кодеки для каждой кодировки, формируешь байтный массив от 0 до 255 и конвертишь его используя кодек, затем обратно в другую кодировку - получаешь 2 таблицы перекодировки...


Название: сp1251->cp866
Отправлено: Shama от Март 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)... )))