Вход:  Пароль:  
FreeSource: Локализация/КодировкаНазванийФайлов ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Это старая версия Локализация/КодировкаНазванийФайлов за 2005-02-18 20:37:22..

О кодировках названий файлов


Оглавление документа

Вступление


Пользователь Linux, который действительно работает в этой системе, часто сталкивается с проблемами кодировки как содержимого файлов, так названий файлов.
Не раз сталкиваясь с этими проблемами, хочу ещё раз поднять вопрос о том, что в системе должно быть место, откуда можно узнать кодировку, используемую для названий файлов в системе.
В первом приближении мы знаем, что в системе имеется файл /etc/sysconfig/i18n, в котором, кроме всего прочего, задана системная локаль строчкой LANG=локаль. Например, у меня в системе указано в этом файле: LANG=ru_RU.KOI8-R

Текущая ситуация в ядре 2.6.10


«Чужие» файловые системы как правило имеют параметр iocharset: isofs, udf, vfat, ntfs, jfs
Для vfat имеется умолчание в ядре: FAT_DEFAULT_CHARSET, FAT_DEFAULT_CODEPAGE, но это константы, что нам не подходит.
В JFS предусмотрен iocharset, позволяющий перекодирование смонтированной системы (как я понимаю, в JFS подразумевается UTF8).

Предлагается


1. Ввести в систему через файл /etc/profile.d/lang.sh переменную G_FILENAME_ENCODING, которая будет задавать текущую кодировку файловой системы.
Эта переменная может использоваться программами, нуждающимся в информации о кодировках названий файлов. В настоящий момент такой программой является GLIB и все программы, построенные на этой библиотеке, то есть GTK-программы и GNOME-программы. Если переменная не установлена, программа просто использует умолчание, которое в неё заложено.


2. Создать (описать) механизм установления соответствия между кодировкой локали и соответствующей кодировкой других систем, в целях совместимости. Это нужно/используется в WINE, SAMBA, DOSEMU.


3. Добавить в программы, работающие с архивами, определение кодировки названий файлов в архивах (сформулировать критерии) и перекодирование названий файлов. Потребуется включенный по умолчанию режим совместимости, когда названия файлов запоминаются в кодировке, принятой в альтернативной системе (Windows).


4. Добавить к mount возможность задания параметров по умолчанию для файловых систем (speed= для cdfs, iochartset для тех, кто это подддерживает). Это решило бы большинство проблем. Одновременно можно внести в mount поддержку /etc/fstab.d

Дополнительно


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


6. Разобраться с использованием Rock Ridge? и Joliet (порядок использования и перекодировка в случае Rock Ridge?) на CD.

Преимущества


И так, что мы получаем:






Программы, где это нужно

GLIB/GTK/GNOME


В gtk есть обработка переменной окружения G_FILENAME_ENCODING, которая у нас _не_ устанавливается, поэтому gtk предполагает, что она соответствует локали. При этом всё ломается, если я хочу запустить программу из другой локали (LANG=ru_RU.UTF-8 или LANG=ru_RU.CP1251) при основной koi8-r.
Так же GLIB обрабатывает переменную G_BROKEN_FILENAMES. Если она установлена, GLib предполагает, что названия файлов хранятся в кодировки локали, а не в UTF-8. Но G_FILENAME_ENCODING имеет больший приоритет.

SAMBA


1. К чему каждый раз после установки раскомментировать в конф. файле строчки про кодировку (unix/display charset), когда они должны устанавливаться
в кодировку файловой системы / локаль автоматически? В крайнем случае такую установку можно выполнить в %post-скрипте


2. При монтировании удалённой файловой системы через smbmount (и mount -t cifs скорее всего тоже) опять же требуется указать кодировку своей системы (iocharset)

Монтирование файловых систем FAT-32, NTFS, ISO9660/Jouliet


Бесконечное количество раз люди бьются с fstab, записывая туда разные iocharset, nls_ и пр. Но ведь можно же брать эти параметры (по умолчанию) из кодировки файловой системы.

DOSEMU


Там происходит перекодирование названий файлов в досовскую кодировку. Скорее всего, используется кодировка локали.

WINE


В основном проблема с кодировками названий файлов не возникает (наверное, решена за счёт предположения соответствия кодировки локали и файловой системы)

Архиваторы


Как правило, в Windows для кодирования названий файлов в архивах используется OEM-кодировка (DOS), в то время как в Linux названия записываются в кодировке файловой системы.


См. Ситуация С Архиваторами

Замечания


Добавить в /etc/sysconfig/i18n параметр “SUPPOSED_ENEMY_CHARSET”, который, скажем, для локалей с koi8-* и cp1251 будет cp866. (Michael Shigorin <mike@osdn.org.ua>)


Тут надо предложить два-три параметра, потому что “ENEMY” систем существует 2–3 (DOS,WIN,MAC)


Как написано в руководстве по нашим дистрибутивам, «Файловая система Linux... является единым деревом». Тут нет понятия ext3, reiserfs, FAT32 или NTFS. И фактически все файлы в этом дереве имеют названия в определённой кодировке. Если монтируемая файловая система (ENEMY :)) имеет другую кодировку, мы используем костыли типа iocharset. Или я чего-то не понимаю, и кто-то в одном каталоге хранит названия файлов в UTF-8, в другом – в koi8-r, в третьем – в cp1251?


Совершенно верно. Такое бывает. Более того, у меня есть необходимость представлять одной конкретной программе имена файлов в iso8859–5, потому что никакую другую кодировку кириллицы она не понимает. Нужно в файловой системе иметь указание кодировки, или всегда хранить имена только в уникоде. Если локаль – не уникод, то надо перекодировать. (Вячеслав Диконов <sdiconov@mail.ru>)


Всё правильно. Я например столкнулся с такой проблемой и сделал соответствующую запись в /etc/sysconfig/hotplug. И еще одна подобная проблема – как определить кодировку файловой системы на новом устройстве? (Anton Farygin <rider@altlinux.com>)


Кодировку на коротких названиях в FAT можно предполагать на основании кодировки файловой системы (для koi8-r/cp1251 будет cp866), для длинных названий на FAT/NTFS известно какая кодировка. А для остальных файловых систем ext?/reiserfs/xfs нужно вводить хранение кодировки или иметь предубеждение, что она там в UTF-8. Также потребуется перекодирование подмонтированной системы.
Получается, ядро должно иметь информацию о кодировке. Кстати, если хранить названия файлов в произвольной кодировке, можно избежать перекодирования, которое будет производится только при различии кодировкой локальной и на монтируемой файловой системе.


Страницы, ссылающиеся на данную: Локализация/НациональнаяСпецификаСистемы


 
Файлов нет. [Показать файлы/форму]
Много комментариев (16). [Показать комментарии/форму]