Использование символов национального алфавита в именах файлов
Заметка: Данная секция этого HOWTO отсутствует в англоязычном варианте. Все дополнения и исправления присылайте на адрес переводчика.
Использование имен файлов содержащих символы русского языка под Linux, как и во многих других вещах осложняется наличием трех кодировок, а также тем, что иногда программы вообще не содержат поддержки символов национального алфавита.
При использовании русских символов в именах файлов нужно учесть следующие обстоятельства:
- для обеспечения совместимости записанных дисков с DOS кодировка символов в ISO9660 должна быть CP866 и имена файлов в формате 8.3 (8 символов - имя, 3 символа - расширение)
- некоторые DOS драйвера CDROM приводов могут не поддерживать не ASCII символов в именах файлов
- для обеспечения совместимости записанных дисков с Windows необходимо добавлять расширение JOLIET, которое использует UNICODE кодировку имен файлов.
- некоторые версии UNIX систем не поддерживают JOLIET расширение (Linux поддерживает при включении соответствующей опции в при сборке ядра) и если требуется совместимость с ними должно использоваться RockRidge расширение.
Родная файловая система Linux - ext2 не делает никаких предположений о кодировке символов, она просто хранит имена файлов в 8-битном представлении. Правильность интерпретации кодировки имени файла зависит от настроек locale программы которая его создала и программы которая выводит его пользователю. Так как Linux способен работать со всеми русскими кодировками (cp866, cp1251, koi8-r, iso8859-5), то вполне возможен случай, когда пользователь создаст файл в терминале с cp866 настройками, а затем попытается его считать его (возможно на другом компьютере) в терминале с koi8-r настройками, и будет озадачен.
Текущая версия mkisofs-1.12.1 при составлении имен файлов в ISO9660 заменяет все не ASCII символы (в том числе и русские) на знак '_'(подчеркивание). Таким образом без применения патчей к mkisofs невозможно записать диск совместимый с DOS. Мне пока не удалось отыскать такой патч, если у кого-то есть положительный опыт записи таких дисков - пришлите мне информацию и я включу ее сюда.
Универсальный метод - включить оба расширения JOLIET и RockRidge на записываемый диск, причем RockRidge будет содержать символы в 8 битном представлении, как и в файловой системе, а для указания кодировки символов файловой системы при преобразовании в Joliet UNICODE, программа mkisofs поставляемая в комплекте с cdrecord, начиная с версии cdrecord-1.8.1 содержит опцию -jcharset. Список доступных кодировок можно получить, запустив
mkisofs -jcharset help
В этом списке присутствуют cp866 и koi8-r но (пока?) отсутствует cp1251.
Если Ваша система использует кодировку koi8-r в качестве основной, что обычное дело под Linux, то команда создания образа диска может быть такой
mkisofs -r -J -jcharset=koi8-r <путь к каталогу с файлами> <путь к образу диска>
Если файлы для создания диска находятся не на разделе с ext2 файловой системой, то возможно потребуется указать опции codepage и iocharset перед монтированием файловой системы. Например при монтировании раздела с FAT/VFAT и выбранной кодировке koi8-r необходимо указать:
mount -o codepage=866,iocharset=koi8-r /dev/hdc1 /mnt/dos
при монтировании NTFS:
mount -o iocharset=koi8-r /dev/hdc2 /mnt/ntfs
Тогда будет осуществляться правильная трансляция имен файлов из файловой системы в желаемую кодировку.
При монтировании компакт-диска с Joliet расширением для правильной трансляции имен файлов из UNICODE необходимо также указывать с опцией iocharset желаемую кодировку для отображения.
mount -o iocharset=koi8-r /dev/cdrom /mnt/cdrom