Неверное имя файла кириллицы при загрузке на сервер
У меня есть эта функция PHP:
function upload_file($f,$fn){
switch($f['type']){
case 'image/jpeg':$image = imagecreatefromjpeg($f['tmp_name']);break;
case 'image/png':case 'image/x-png':move_uploaded_file($f['tmp_name'],'../images/pc/'.$fn.'.png');break;
case 'image/pjpeg':$image = imagecreatefromjpeg($f['tmp_name']);break;
echo $f['type'],'<br />';
}
if(!empty($image)) imagejpeg($image,'../images/pc/'.$fn.'.png');
}
где $fn = "нова-категория", но когда я загружаю переименованный файл на сервер - имя изображения не работает и выглядит так: РЅРѕРІР°-категория.png
Интересно то, что если я попытаюсь посетить изображение на сервере: site.com/images/pc/нова-категория.png => я могу увидеть изображение.. Можете ли вы дать мне представление о том, что тормозит имя изображения, чтобы посмотреть нормальный?
1 ответ
Когда вы просматриваете ftp с клиентом ftp, вы видите ANSI-кодированные имена (однобайтовые кодировки). В этом случае
нова-категория.png
на самом деле UTF-8 (двухбайтовый) кодируетсянова-категория.png
Когда вы загружаете файл на веб-сервер, браузер конвертирует символы не в кодировке Юникод в имени файла в UTF-8 (
нова-категория.png
становитсяРЅРѕРІР°-категория.png
)Когда вы запрашиваете
site.com/images/pc/нова-категория.png
браузер снова конвертирует символы не в юникоде в UTF-8, и сервер фактически ищетРЅРѕРІР°-категория.png
(в ASCI-кодировке).
Поэтому, если вы хотите видеть "нормальные" имена в ftp-клиенте, вам следует преобразовать их в вашу нативную кодировку
function upload_file($f,$fn){
$fn=iconv("UTF-8","Windows-1251",$fn);
switch($f['type']){
...
Но в этом случае у вас будут проблемы с URL-адресами ваших файлов. Чтобы написать правильный URL для имен в кодировке ANSI, вы должны использовать этот php-код:
echo "site.com/images/pc/".rawurlencode("нова-категория.txt");
Способ обработки имен файлов зависит от того, как вы их используете. Но я не рекомендую вам конвертировать их. Если у вас есть проблемы, я думаю, что это не в "сломанных" именах.