PHP – 上传utf-8文件名

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

如何解决这个谢谢

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

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

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

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

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

我不太确定您的操作系统的默认代码页是否是1258 ,您应该打开命令提示符并键入命令chcp来检查它自己。 然后改变1258到任何命令给你。

UPDATE

看来,PHP文件系统function只能处理系统代码页中的字符,根据这个答案 。 所以你有两个select:

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

  2. 将您的系统代码页更改为cp12581258并将文件名转换为cp1258 。 然后文件系统function应该工作。

两种select都是不足的:

select1:你不能使用越南的字符,这不是你想要的。

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

UPDATE

如何更改系统代码页:

转到Control Panel > Region > Administrative > Change system locale然后在下拉菜单中selectVietnamese(Vietnam)

这个meta不起作用:

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

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

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

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

确保你在任何HTML,内容或任何被发送之前把这个。


或者, form上的accept-charset标签应该像weel一样工作:

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

迄今为止唯一的解决scheme ..(2014年):

1)我不把文件存储在我的FTP UTF-8string 。 相反,我使用这个function来重命名上传的文件:

 <?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 ;

开始获取检测文件名编码(在上传之前)。

 print_r($_FILES["upload"]); 

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

抱歉! 你的问题是关于文件名。

你必须用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); }?> 

尝试这个

 $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) ; 

你可以使用这个

 $fn2 = basename($_FILES['upload']['name']);