我是越南人,我想上传像
这样的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
如何解决这个问题
答案 0 :(得分:14)
我使用的是Windows 8中文版,我处理类似的问题:
$filename = iconv("utf-8", "cp936", $filename);
cp
代表Code page
,cp936
代表Code page 936,这是简体中文版Windows的默认代码页。
<击> 所以我想也许你的问题可以通过类似的方式解决:
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
我不太确定您的操作系统的默认代码页是否为1258
,您应该通过打开命令提示符并输入命令{{1}来自行检查}。然后将chcp
更改为命令提供的任何内容。
击>
<强>更新强>
根据this answer,PHP文件系统函数似乎只能处理系统代码页中的字符。所以你有2个选择:
将文件名中的字符限制为系统代码页 - 在您的情况下,它是1258
。但我很确定代码页437不包含所有越南字符。
将您的系统代码页更改为越南语437
并将文件名转换为1258
。那么文件系统功能应该可以工作。
两种选择都有缺陷:
选择1:你不能再使用越南人,这不是你想要的。
选择2:您必须更改系统代码页,并且文件名字符仅限于代码页1258。
<强>更新强>
如何更改系统代码页:
转到cp1258
&gt; Control Panel
&gt; Region
&gt; Administrative
并在下拉菜单中选择Change system locale
。
答案 1 :(得分:5)
此meta
无效:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
因为Web服务器已经发送了Content-Type
标头,因此确定了编码的内容。 Web浏览器以相同的编码发送表单。当用户离线时,meta
非常有用。
所以你必须自己创建http标头Content-Type
:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
确保在任何html,内容或其他任何内容之前放置它。
或者,accept-charset
上的form
代码应该像weel一样工作:
<form accept-charset="utf-8">
答案 2 :(得分:1)
迄今为止我找到的唯一解决方案 ..(2014年):
1)我不会在 UTF-8字符串中将文件存储在我的FTP上。相反,我使用此功能重命名上传的文件:
<?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
;
答案 3 :(得分:1)
我是波斯语,我的语言中有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 );
答案 4 :(得分:0)
答案 5 :(得分: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);
}?>
答案 6 :(得分:-1)
试试这个
$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);
}
答案 7 :(得分:-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) ;
答案 8 :(得分:-2)
您可以使用此
$fn2 = basename($_FILES['upload']['name']);