Русские буквы в именах файлов
Материал из 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
Все и так работает.

