web-dev-qa-db-fra.com

PHP - Télécharger le nom de fichier utf-8

Je suis vietnamien et je souhaite 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ésoudre ce problème grâce

23
DeLe

Je suis sur la version chinoise de Windows 8, et je traite un problème similaire avec ceci:

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

cp signifie Code page et cp936 signifie page de codes 936 , qui est la page de codes par défaut de la version chinoise simplifiée de Windows.

Je pense donc que votre problème pourrait être résolu de la même manière:

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

Je ne sais pas trop 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 en tapant la commande chcp. Remplacez ensuite 1258 Par tout ce que la commande vous donne.

[~ # ~] mise à jour [~ # ~]

Il semble que PHP ne peuvent gérer que les caractères qui se trouvent dans la page de codes système, selon cette réponse . Vous avez donc 2 choix ici:

  1. Limitez les caractères du nom de fichier à la page de codes système - dans votre cas, c'est 437. Mais je suis presque sûr que la page de codes 437 n'inclut pas tous les caractères vietnamiens.

  2. Remplacez la page de code de votre système par 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 modifier la page de codes système et les caractères de nom de fichier sont limités à la page de codes 1258.

[~ # ~] mise à jour [~ # ~]

Comment changer la page de codes système:

Allez dans Control Panel> Region> Administrative> Change system locale Et sélectionnez Vietnamese(Vietnam) dans le menu déroulant.

14
Inglis Baderson

Ce meta n'a aucun effet:

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

car le serveur Web a déjà envoyé Content-Type header, et a donc décidé quel sera le codage. Les navigateurs Web envoient des formulaires avec le même encodage. meta est utile lorsque l'utilisateur est hors ligne.

Vous devez donc sniper l'en-tête http Content-Type par toi-même:

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

assurez-vous de le mettre avant tout html, contenu ou tout ce qui est envoyé.


Alternativement, accept-charset tag sur form devrait fonctionner comme weel:

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

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 sur la langue vientam mais peut-être pouvez-vous 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
rezaSefiddashti

La seule solution J'ai trouvé jusqu'à présent .. (année 2014):

1) Je ne stocke pas de fichiers sur mon FTP dans chaîne UTF-8. 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) Vous pouvez maintenant renommer (ou etc) $newname;

1
T.Todua

Pour commencer, détectez l'encodage du nom de fichier (avant le téléchargement).

print_r($_FILES["upload"]);

Insérez le nom du fichier dans décodeur et vérifiez l'encodage.

0
iproger

Pardon! votre question concerne le nom du fichier.

Vous devez enregistrer votre nom de fichier avec iconv mais lire sans cela.

pour économiser:

<?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}')");
?>

à 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
Danoosh