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