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

23
demandé sur Thein Hla Maw 2013-08-13 12:38:16

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:

  1. 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.

  2. Changez votre page de code système pour la page vietnamienne: 1258 et 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.

14
répondu Inglis Baderson 2017-05-23 12:09:45

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"> 
5
répondu Zaffy 2015-04-28 18:19:20

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;

1
répondu T.Todua 2014-11-15 10:10:14

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 );
1
répondu rezaSefiddashti 2018-02-06 04:46:24

Pour commencer obtenir la détection de codage de nom de fichier (avant le téléchargement).

print_r($_FILES["upload"]);

Insérez le nom de fichier dans decoder et vérifiez l'encodage.

0
répondu iproger 2013-08-19 09:24:52

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

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); 
}
-1
répondu 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
répondu Saurabh Chandra Patel 2013-08-28 07:20:44

Vous pouvez utiliser ceci

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