PHP – загрузить utf-8 filename

Я вьетнамский, и я хочу загрузить файл utf-8, например

Tên Tệp Tiếng Việt.JPG

Вот мой код

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>utf-8</title> </head> <body> <?php if(isset($_POST["submit"])) { if($_FILES["upload"]["error"] > 0 ) echo "FILE ERROR!"; else { $base_dir = "D:/"; $fn = $_FILES["upload"]["name"]; $fn2 = $base_dir.$fn; move_uploaded_file($_FILES["upload"]["tmp_name"],$fn2); } } ?> <form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input type="file" name="upload" id="upload" /> <input type="submit" name="submit" id="submit" value="Send" /> </form> </body> </html> 

но когда я загружаю, что вижу на своем компьютере, D: \ имеет файл вроде

Tên Tệp Tiếng Việt.JPG

Как исправить это спасибо

Я нахожусь в китайской версии Windows 8, и я имею дело с подобной проблемой:

 $filename = iconv("utf-8", "cp936", $filename); 

cp означает « Code page а cp936 означает « Кодовая страница 936» , которая является кодовой страницей по умолчанию упрощенной китайской версии Windows.

Поэтому я думаю, что, может быть, ваша проблема может быть решена аналогичным образом:

 $fn2 = iconv("UTF-8","cp1258", $base_dir.$fn); 

Я не совсем уверен, является ли стандартная кодовая страница вашей ОС 1258 или нет, вы должны проверить ее самостоятельно, открыв командную строку и введите команду chcp . Затем измените значение 1258 на то, что команда дает вам.

ОБНОВИТЬ

Похоже, что функции файловой системы PHP могут обрабатывать только символы, которые находятся в системной кодовой странице, в соответствии с этим ответом . Итак, у вас есть 2 варианта:

  1. Ограничьте символы в имени файла системной кодовой страницей – в вашем случае это 437 . Но я уверен, что кодовая страница 437 не содержит всех вьетнамских символов.

  2. Измените кодовую страницу системы на vietnamese один: 1258 и преобразуйте имя файла в cp1258 . Тогда функции файловой системы должны работать.

Оба варианта недостаточны:

Выбор 1: вы больше не можете использовать символы vietnamese, чего вы не хотите.

Выбор 2: вам нужно изменить страницу системного кода, а имена файлов ограничены кодовой страницей 1258.

ОБНОВИТЬ

Как изменить системную кодовую страницу:

Перейдите в Control Panel > Region > Administrative > Change system locale и выберите Vietnamese(Vietnam) в раскрывающемся меню.

Эта meta не влияет:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

потому что веб-сервер уже отправил заголовок Content-Type и, таким образом, решил, какова будет кодировка. Веб-браузеры отправляют формы в одной кодировке. meta используется, когда пользователь отключен.

Таким образом, вы должны sned http-заголовок Content-Type самостоятельно:

 <?php header("Content-Type: text/html; charset=utf-8"); ?> 

убедитесь, что вы помещаете это перед любым html, контентом или любым другим.


В качестве альтернативы, тег accept-charset в form должен работать как результат:

  <form accept-charset="utf-8"> 

Единственное решение, которое я нашел до сих пор .. (2014 год):

1) Я не хранил файлы на своем FTP в строке UTF-8 . Вместо этого я использую эту функцию, чтобы переименовать загруженные файлы:

 <?php // use your custom function.. for example, utf8_encode $newname = utf8_encode($_FILES["uploadFile"]["name"]); move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname); ?> 

2) Теперь вы можете переименовать (или etc) $newname ;

Для начала необходимо определить кодировку имени файла (перед загрузкой).

 print_r($_FILES["upload"]); 

Вставьте имя файла в декодер и проверьте кодировку.

Сожалею! ваш вопрос касается имени файла.

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

для сохранения:

 <?php $name = $_FILES['photo']['name']; $unicode = iconv('windows-1256', 'utf-8', $name); move_uploaded_file($_FILES['photo']['tmp_name'], 'photos/' . $name); mysql_query("INSERT INTO `photos` (`filename`) VALUES ('{$unicode}')"); ?> 

для чтения:

 <?php $images = mysql_query('SELECT * FROM `photos`'); if($images && mysql_num_rows($images) > 0) { while($image = mysql_fetch_assoc($images)) { $name = iconv('utf-8', 'windows-1256', $image['filename']); echo '<img src="photos/' . $name . '"/>'; } mysql_free_result($images); }?> 

попробуй это

 $imgname = $_FILES['img'] ['name'] ; $imgsize = $_FILES['img'] ['size'] ; $imgtmpname = $_FILES['img'] ['tmp_name'] ; $imgtype = $_FILES['img'] ['type'] ; $size = 1024; $imgtypes = array('image/jpeg','image/gif','image/png'); $folder = "up"; if(empty($imgname)){ echo "Shose ur photo"; }else if(!in_array($imgtype,$imgtypes)){ echo "this photo type is not avalable"; }else if($imgsize > $size){ echo "this photo is dig than 6 MB"; }else if($imgwidth > 5000){ echo "the file is to big"; } else{ move_uploaded_file($imgtmpname, $folder, $filename); } 
 function convToUtf8($str) { if( mb_detect_encoding($str,"UTF-8, ISO-8859-1, GBK")!="UTF-8" ) { return iconv("gbk","utf-8",$str); } else { return $str; } } $filename= convToUtf8($filename) ; 

Вы можете использовать это

 $fn2 = basename($_FILES['upload']['name']);