Название: с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)... ))) |