Русские буквы в именах файлов

Материал из 1GbWiki.

Перейти к: навигация, поиск

Содержание

[править] Общие сведения

Каждый web-мастер должен знать, что использовать русские буквы в названиях файлов нельзя,

<a href="/мой_котик.jpg">котеночек</a>

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

[править] UNIX

Все современные обозреватели по-умолчанию передают URI на сервер в кодировке UTF-8 и web-сервер Apache оперирует с файлами в той кодировке, в которой пришел запрос. Поэтому, вам достаточно, при создании файла с русскими буквами использовать кодировку UTF-8 и без каких-либо дополнительных настроек все будет работать.

Как это сделать.

  • если вы работаете с файлами через SSH, то в ~/.bashrc добавьте:
export LANG=ru_RU.utf8

файлы будут создаваться в правильной кодировке.

  • если через FTP/WinSCP из Windows, то файлы создаются всегда в windows-1251. Перекодировать их можно с помощью такой команды, выполненной в консоле SSH:
cd ~/http && for FN in `find . -type f`; do NEW_FN=`echo $FN | iconv -f cp1251 -t utf8`; if [ "${FN}" != "${NEW_FN}" ]; then mv ${FN} ${NEW_FN}; fi; done

Пример: http://unix.1gb.ru/котеночек.jpg

[править] Листинг каталогов в Apache

В режиме листинга каталога, веб-сервер Apache все равно может отображать файлы/папки в неправильной кодировке (предполагается, что имена файлов и каталогов заданы в UTF-8). Пример:

листинг каталога с нечитаемыми именами файлов
листинг каталога с нечитаемыми именами файлов

Чтобы исправить это, необходимо добавить в файл .htaccess следующий код:

IndexOptions +Charset=UTF-8
имена файлов отображаются правильно
имена файлов отображаются правильно

[править] Windows

[править] Apache

Аналогично UNIX'у, только перекодировать имена файлов нужно через какой-то скрипт. Пример на PHP:

function convert_files ($start_dir='.') {

    $files = array();
    if (is_dir ($start_dir)) {
        $fh = opendir ($start_dir);
        while (($file = readdir ($fh)) !== false) {
            if ($file == '.' || $file == '..') continue;
            $filepath = $start_dir . '/' . $file;
            if (is_dir ($filepath) )
                $files = array_merge ($files, convert_files ($filepath));
            $new_filepath = iconv ('cp1251', 'utf-8', $filepath);
            if ($filepath !== $new_filepath)
                rename ($filepath, $new_filepath);
        }
    closedir($fh);
    } else {
        $files = false;
    }

    return $files;
}

$files = convert_files('.');

[править] IIS / сервер для .NET

Все и так работает.

[править] См. также

Личные инструменты