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