= Сообщение: 2744 из 3580 ======================================== RU.GOLDED = От : Vitaliy Aksyonov 1:104/117 03 Oct 23 07:14:18 Кому : Semen Panevin 03 Oct 23 07:14:18 Тема : Re: Еще один крэш FGHI : area://RU.GOLDED?msgid=1:104/117+651c13ae На : area://RU.GOLDED?msgid=2:5025/121+651bd3a7 = Кодировка сообщения определена как: CP866 ================================== Ответ: area://RU.GOLDED?msgid=1:104/117+651cd052 ============================================================================== Привет, Semen!
03 Oct 23 11:31, ты писал(а) мне:
VA>>> hunspell пытается проверять орфографию, думая, что ему подсунули VA>>> текст в UTF-8, а там KOI8-R. И ему срывает крышу. SP>> Интересно... SP>> Но там же iconv не для перекодировки в коде проверки орфографии SP>> ли используется как раз? У меня вроде включен.
SP> Попробовал не сохранять сообщение, а отменить.
Там есть заезд по памяти в одном месте точно. В файле goldlib\gall\gespell.cpp в функции void CSpellLang::RecodeText(const char *srcText, std::string &dstText, bool flag) найди строку char *dstbuffer = new char[srcLen+1]; и сделай буффер побольше, например вот так char *dstbuffer = new char[srcLen * 4 + 1];
При преобразовании однобайтной кодировки в UTF-8 весело портим память. Размер буфера не проверяется.
Еще у меня коряво преобразовывает из KOI8-R в UTF-8. С этим я еще покопаюсь.
А вообще, попробуй ради эксперимента преобразовать свои словари в KOI8-R и попробуй с "родным" hunspell и с твоим патчем. 99%, что взлетит. У меня точно работает.
Для этого достаточно перекодировать .dic и .aff файлы и в .aff файле поменять _SET UTF-8_ на _SET KOI8-R_
Очень интересно, взлетит ли у тебя.
SP> Попялился в код на тему кодировок словаря и iconv. SP> Кодировка словаря там точно загружается, и скармливается SP> перекодировщику. А тот в свою очередь вроде как юзает
SP> int LoadCharset(const char* imp, const char* exp, int query) SP> ... SP> #ifdef HAS_ICONV SP> if( iconv_cd != (iconv_t)(-1) ) SP> iconv_close(iconv_cd); SP> iconv_cd = iconv_open(exp, imp); SP> if(iconv_cd != (iconv_t)(-1) ) SP> LOG.printf("iconv is initialised to convert from %s to %s", SP> imp, exp); SP> else SP> LOG.printf("Can't initialise iconv to convert from %s to %s", SP> imp, exp); #endif SP> ...
Пробовал с iconv. Во-первых я удивился, что они его используют посимвольно, вместо того, чтобы всю строку сразу преобразовать. Во-вторых, там есть косяки с инициализацией. И конкретно в спеллчекере у меня получилось, что вместо того, чтобы преобразовывать из KOI8-R в UTF-8, оно преобразовывает из CP866 в KOI8-R. Естественно, получается каша. :)
SP> Хотел почитать лог, и обнаружил что лог файл у меня создаётся, но он SP> всегда пустой. Вообще никаких логов. ЧЯДНТ? В конфиге ничего про лог SP> левелы не нашёл. Лог формат стоит вроде Fd. Попробовать другой?
SP> Что интересно - дальше в коде LoadCharset вроде как нету использования SP> iconv, проходится по таблицам перекодировки из конфига, и если не SP> находит там нужную (а utf8 у меня действительно нету, я как-то на SP> iconv полагался...) то говорит "не шмогла", current_table = -1 и SP> return 0
SP> Что происходит дальше - пока некогда разбираться... SP> Понять бы, почему логи не пишутся...
Логи у меня пишутся. Логлевелов вроде там нет никаких. Хотя я могу быть неправ. Еще на настолкьо глубоко вникал.
Хуже всего то, что некоторый код весело пишет в stdout/stderr и портит картинку.
ЗЫ. Вот и нашел себе следущую задачу. :) Переделать XlatStr, чтобы не было заездов по памяти. Как минимум - передавать размер выходного буфера.