26

我是越南人,我想上传一个 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

怎么解决 谢谢

4

9 回答 9

15

我在 Windows 8 中文版上,我处理类似的问题:

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

cp代表Code page 936Code pagecp936是Windows简体中文版的默认代码页。

所以我想也许你的问题可以用类似的方式解决:

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

我不太确定您的操作系统的默认代码页是否是1258,您应该通过打开命令提示符并输入命令自行检查chcp。然后更改1258为命令给您的任何内容。

更新

根据这个答案,PHP文件系统函数似乎只能处理系统代码页中的字符。所以你在这里有两个选择:

  1. 将文件名中的字符限制为系统代码页 - 在您的情况下,它是437. 但我很确定代码页 437 不包括所有越南语字符。

  2. 将您的系统代码页更改为越南语:1258并将文件名转换为cp1258. 然后文件系统功能应该可以工作。

两种选择都有缺陷:

选择1:你不能再使用越南语字符了,这不是你想要的。

选择 2:您必须更改系统代码页,并且文件名字符仅限于代码页 1258。

更新

如何更改系统代码页:

转到Control Panel> Region> Administrative>Change system localeVietnamese(Vietnam)在下拉菜单中选择。

于 2013-08-28T07:27:26.260 回答
5

meta没有效果:

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

因为 Web 服务器已经发送了Content-Type标头,因此决定了编码是什么。Web 浏览器以相同的编码发送表单。meta用户离线时很有用。

所以你必须自己sned http header Content-Type

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

确保将其放在任何 html、内容或发送的任何内容之前。


或者,accept-charset标记form应该也可以正常工作:

 <form accept-charset="utf-8"> 
于 2013-08-25T21:16:59.017 回答
2

我是波斯人,我的语言中的 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 );
于 2018-02-06T04:46:24.667 回答
1

到目前为止我找到的唯一解决方案..(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

于 2014-11-03T08:53:01.517 回答
0

对不起!你的问题是关于文件名的。

你必须用 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);
}?>
于 2013-08-28T08:37:22.440 回答
0

首先要检测文件名编码(在上传之前)。

print_r($_FILES["upload"]);

将文件名插入解码器并检查编码。

于 2013-08-19T09:24:52.230 回答
-1
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) ;
于 2013-08-28T07:20:44.380 回答
-2

尝试这个

$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); 
}
于 2013-08-26T15:32:31.137 回答
-3

你可以用这个

$fn2 = basename($_FILES['upload']['name']);
于 2013-08-24T19:45:21.150 回答