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

如何解决这一点,谢谢


答案 1

我使用的是Windows 8中文版,我处理类似的问题:

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

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

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

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

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

更新

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

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

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

这两种选择都存在缺陷:

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

选项 2:必须更改系统代码页,并且文件名字符限制为代码页 1258。

更新

如何更改系统代码页:

转到> > >,然后在下拉菜单中选择。Control PanelRegionAdministrativeChange system localeVietnamese(Vietnam)


答案 2

这没有任何影响:meta

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

因为Web服务器已经发送了标头,从而决定了将编码是什么。Web 浏览器以相同的编码发送表单。当用户脱机时,这很有用。Content-Typemeta

所以你必须自己去抓http头:Content-Type

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

确保在发送任何html,内容或任何内容之前放置此内容。


或者,标记 on 应按 weel 工作:accept-charsetform

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

推荐