Я вьетнамский, и я хочу загрузить файл 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 варианта:
  Ограничьте символы в имени файла системной кодовой страницей – в вашем случае это 437 .  Но я уверен, что кодовая страница 437 не содержит всех вьетнамских символов. 
  Измените кодовую страницу системы на 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']);