PHP-Upload utf-8 Nom du fichier
Je suis Vietnamien et je veux télécharger un nom de fichier utf-8 comme
Tên Tệp Tiếng Việt.JPG
Voici mon code
<!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> 
, Mais quand je télécharge ce que je vois sur mon ordinateur D: a un fichier comme
Tên Tệp Tiếng Việt.JPG
Comment réparer cela merci
9 réponses
Je suis sur Windows 8 version chinoise, et je fais face à un problème similaire avec ceci:
$filename = iconv("utf-8", "cp936", $filename);
cp Code page et cp936  Code page 936, qui est la page de code par défaut de la version chinoise simplifiée de Windows.
Donc, je pense que peut-être votre problème pourrait être résolu de la même manière:  
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
Je ne suis pas tout à fait sûr si la page de code par défaut de votre système d'exploitation est 1258 ou non, vous devriez le vérifier vous-même en ouvrant l'invite de commande et entrez la commande chcp. Ensuite, changez 1258 en ce que la commande vous donne.
Mise à JOUR
Il semble que les fonctions du système de fichiers PHP ne peuvent gérer que les caractères qui sont dans la page de code du système, selon cette réponse . Vous avez donc 2 choix ici:
- Limitez les caractères dans le nom de fichier à la page de code système - dans votre cas, c'est - 437. Mais je suis sûr que la page de code 437 ne comprend pas tous les Vietnamiens caractère.
- Changez votre page de code système pour la page vietnamienne: - 1258et convertissez le nom de fichier en- cp1258. Ensuite, les fonctions du système de fichiers devraient fonctionner.
Les deux choix sont déficients:
Choix 1: vous ne pouvez plus utiliser de caractères vietnamiens, ce qui n'est pas ce que vous voulez.
Choix 2: vous devez changer la page de code système, et les caractères du nom de fichier sont limités à la page de code 1258.
Mise à JOUR
Comment changer page de code du système:
Aller à Control Panel > Region > Administrative > Change system locale et sélectionnez Vietnamese(Vietnam) dans le menu déroulant.
Ce meta n'a aucun effet:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Parce que le serveur web a déjà envoyé l'en-tête Content-Type, et a donc décidé quel sera le codage. Les navigateurs Web envoient des formulaires dans le même encodage. Le meta est utile lorsque l'utilisateur est hors-ligne.
Vous devez donc sned http header Content-Type par vous-même: 
<?php header("Content-Type: text/html; charset=utf-8"); ?>
Assurez-vous que vous mettez cela avant tout html, contenu ou tout ce qui est envoyé.
Sinon, accept-charset balise form devrait fonctionner ainsi:
 <form accept-charset="utf-8"> 
La seule solution j'ai trouvé jusqu'à présent.. (2014 année):
1) Je ne stocke pas de fichiers sur mon FTP dans UTF-8 string . Au lieu de cela, j'utilise cette fonction, pour renommer les fichiers téléchargés:
<?php
// use your custom function.. for example, utf8_encode
$newname  = utf8_encode($_FILES["uploadFile"]["name"]);
move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname);
?> 
2) Maintenant, vous pouvez renommer (ou etc) $newname;
Je suis persan et j'ai le même problème avec le caractère utf-8 dans ma langue. Je pourrais résoudre mon problème avec ce code:
$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 );
Je ne suis pas sûr de la langue vientam mais peut-être que vous pouvez utiliser le même code que ci-dessus avec quelques modifications:
$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 );
Désolé! votre question concerne le nom de fichier.
Vous devez enregistrer votre nom de fichier avec iconv mais lire sans cela.
Pour enregistrer:
<?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}')");
?>
Pour lire:
<?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);
}?>
Essayez ceci
$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) ;
Vous pouvez utiliser ceci
$fn2 = basename($_FILES['upload']['name']);