一尘不染

PHP-上传utf-8文件名

php

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

如何解决这个问题


阅读 305

收藏
2020-05-26

共1个答案

一尘不染

我使用的是Windows 8中文版,与此同时我也遇到类似的问题:

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

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

所以我认为也许您的问题可以通过类似的方式解决:

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

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

更新

PHP文件系统功能似乎只能处理系统代码页中的字符。因此,您在这里有2个选择:

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

  2. 将系统代码页更改为越南语:1258将文件名转换为cp1258。然后,文件系统功能应该起作用。

两种选择都是不足的:

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

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

更新

如何更改系统代码页:

转到Control Panel> Region> Administrative> Changesystemlocale,并选择Vietnamese(Vietnam)在下拉菜单中。

2020-05-26