замена iconv

Werdna

Есть такая пакость у юниксоводов -- это черезжопный iconv. Он туп до безобразия, и у него идиотский api, и он не переводит, если натыкается на незнакомый для определенной кодировки символ.
Мне надо нечто (в идеале умеющее переводить из одной кодировки в другую. Желательно с интерфейсом вида "std::string convert(const std::string &)" Как минимум -- UTF-8, win-1251, koi8-r. Но хотелось бы не ограничивать себя этим набором.
Я использовал iconv, но эта дрянь загадочно срала то ли в неположеные куски памяти, то ли стек охуячивала хитроумно, в общем, я имел редкие, но стабильные сегфолты. Отключение iconv убирало сегфолты.
Кто знает что-нибудь, что позволит мне работать нормально с кодировками?

Marinavo_0507

Интересно, как же у других получаются нормальные проги без сегфолтов.

ppplva

enca
У iconv есть режим, в котором он пропускает неконвертящиеся символы.

Helga87

Одним из решений является написание программы на управляемых языках: Java, C#, Lisp, и пр.

Marinavo_0507

И перекодировщик самому что ли писать?

VitMix

На Java сама по себе знает немало кодировок.

vall

просто в этих языках уже написаны обёртки вокруг iconv.

Helga87

Могу достоверно сказать, что Mono (это который .Net под все-что-можно) не использует iconv. Есть мнение, что и Java, но тут не проверял.

vall

У iconv есть режим, в котором он пропускает неконвертящиеся символы.
где он включается?

sergey_m

Я использовал iconv, но эта дрянь загадочно срала то ли в неположеные куски памяти, то ли стек охуячивала хитроумно, в общем, я имел редкие, но стабильные сегфолты. Отключение iconv убирало сегфолты.
Наверное ты просто неправильно им пользовался. Я однажды имел дело с iconv и осталось впечатление, что API у него не такое каким кажется в самом начале.
То есть поначалу делаешь ошибки, а потом понимаешь что кое-где недопонял что имелось в виду в man.

Helga87

Мое утверждение было на вопрос: как писать без sigfault-ов

Marinavo_0507

Это примерно как мыши должны стать ёжиками?

Werdna

Наверное ты просто неправильно им пользовался.
Найти ошибку не смог. Сегфол происходит совершенно(!) в другом месте, в другое время, и по непонятной причине -- просто попадается битый указатель. Около месяца я ставил опыты, отрубая разные части своей проги, и очень долго не мог понять, как функция из нескольких strstr и моей super_URL_unescape (она-то сволочь и делает iconv!) влияет на работу другой части. На iconv я бы никогда ничего не подумал -- уже больно распространенная вещь.
Отладка была невозможна -- процесс падал крайне редко, где-то раз в сутки, и при выжирании 1,5-2 гигов оперативки, в других случаях была полная стабильность. valgrind ес-но нигде ликов/выходов за пределы не находил, да и работал бы он суточный цикл 2-3 месяца. gdb вообще скромно показывал на битый указатель, и ясно, что бился он ой как задолго до сегфолта.
Использую я iconv вроде правильно. Конечно, еще раз перечитаю маны, но есть подозрение, что там есть баг. Другой причины я не вижу.
Сейчас смотрю, что, скорее всего, придется сделать скромную свою конвертилку, хотя может быть что-то и приглядится. :/

ppplva

iconv -c

Julie16

1) iconv - не падает и не глючит, если с ним работать как надо. В общем я уверен на 99 и 9 десятых процента что виноват именно ты.
2) у меня есть надежная и отлаженная плюсовая обертка над iconv. Могу поделиться если надо - http://sourceforge.net/projects/libcore - там слегка outdated версия, могу дать и поновее.
3) можно попробовать libicu

Olyalyau

Попробуй воспользоваться разными тулзами для поиска причины SIGSEGV'а. Это удобнее, чем отрубать части программы. К тому же, если у тебя где-то есть ошибка работы с памятью она может просто проявляться или не проявляться в определённых условиях. Вот ты закомментировал другое место и она перестала проявляться, а ты будешь думать -- вот оно, нашёл. Так что efence, malloc debug, valgrind, purify или что-нибудь подобное в руки и понеслась
Оставить комментарий
Имя или ник:
Комментарий: