LINUX.ORG.RU

Как на лету перекодировать имена файлов в cp1251?


0

0

Есть линукс с юникодной локалью. Есть программа, которая не в курсе о существовании utf8. Когда программа отображает имена файлов - она делает это так, будто кодировка - cp1251. Как отдавать ей имена файлов так, чтоб она смогла их отобразить?

Рассмотрены варианты:

1. convmv не подходит, имена должны оставаться читаемы из файлового менеджера

2. convmvfs усложнит запуск, оставлю этот вариант на крайний случай.

3. Нравится идея с LD_PRELOAD и заменой функций foped, readdir и прочего. Но мороки с этим много, может уже кто-то делал такое? Гуглил - не нашёл.

PS вообще речь идёт о русских модулях для neverwinter nights, но решение пригодится и в других случаях.

★★★★★

Ответ на: комментарий от kilolife

>А пачка линков с именами в нужной кодировке вас не спасут?

Они сводят гуёвые файлменеджеры с ума.

legolegs ★★★★★
() автор топика
Ответ на: комментарий от kilolife

>А хардлинки тоже сводят с ума ваши файлменеджеры?

Любые хреново выглядящие имена. Сообщения об ошибках при копировании, удалении и т.п.

legolegs ★★★★★
() автор топика

Я давно реализовывал идею с LD_PRELOAD. Нужно было отдавать имена файлов с ftp-сервера в cp1251, хотя у меня они в utf8. Всё прекрасно работало. Сейчас попробовал ту свою библиотечку - не работает на тесте. Наверное, я немного её поломал когда-то при добавлении поддержки LARGEFILE, но забыл допилить. :(

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

Вроде допилил, но основательно не проверял. Тест из test.c (readlink(3)) работает корректно. Makefile очень простой, всё готово к сборке для Linux.

http://ifolder.ru/12990525

Запускать так:
$ CHARSET_FROM=utf8 CHARSET_TO=cp1251 LD_PRELOAD=libfnc.so <программа>

При компиляции в Linux возникает 3 ворнинга: 2 на iconv и один на тест. Забить.

Sorcerer ★★★★★
()
Ответ на: Работает!111 от legolegs

Нет, не работает :( Имена файлов отображаются верно, но fopen похоже не перехватывается

legolegs ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Так. я добавил fopen64(), это позволило обмануть cat. Но моя программа судя по strace пользуется open(). Я добавил extern к имеющемуся опену и сделал также open64, но это не помогает - они не перехватываются. Возможно, дело в "...".

Пойду спать.

legolegs ★★★★★
() автор топика
Ответ на: комментарий от Sorcerer

Допилено.

Добавил __xstat и __lxstat (без которых ничерта не работало) и лог.

http://narod.ru/disk/10963540000/fnc.tar.bz2.html

Компилял gcc 4.4 и тестил только под линуксом, так что если что не так - извиняйте. Ворнинги изжил, хоть и, боюсь, не совсем правильным способом.

legolegs ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.