PHP - Загрузить имя файла utf-8


Я вьетнамец и хочу загрузить имя файла 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

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

Author: Thein Hla Maw, 2013-08-13

9 answers

Я нахожусь в китайской версии 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. Измените системную кодовую страницу на вьетнамскую: 1258 и преобразуйте имя файла в cp1258. Тогда функции файловой системы должны работать.

Оба варианта являются недостаточными:

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

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

ОБНОВЛЕНИЕ

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

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

 14
Author: Inglis Baderson, 2017-05-23 12:09:45

Это meta не имеет никакого эффекта:

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

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

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

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

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


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

 <form accept-charset="utf-8"> 
 5
Author: Zaffy, 2015-04-28 18:19:20

Единственное решение, которое я нашел до сих пор.. (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) Теперь вы можете переименовать (или и т. Д) $newname;

 1
Author: T.Todua, 2014-11-15 10:10:14

Я перс, и у меня такая же проблема с символом utf-8 на моем языке. Я мог бы решить свою проблему с помощью этого кода:

$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','windows-1256', str_replace('ی', 'ي', $fn));
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );

Я не уверен в языке vientam, но, возможно, вы можете использовать тот же код, что и выше, с некоторыми изменениями:

$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','cp936', $fn);
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );
 1
Author: rezaSefiddashti, 2018-02-06 04:46:24

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

print_r($_FILES["upload"]);

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

 0
Author: iproger, 2013-08-19 09:24:52

Извините! ваш вопрос касается имени файла.

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

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

<?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);
}?>
 0
Author: Danoosh, 2013-08-28 09:15:09

Попробуйте это

$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); 
}
 -1
Author: Mahmoud Samy, 2013-08-26 15:32:31
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) ;
 -1
Author: Saurabh Chandra Patel, 2013-08-28 07:20:44

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

$fn2 = basename($_FILES['upload']['name']);
 -2
Author: guihknx, 2013-08-24 19:45:21