通过PHP上传后,Filename包含FTP中的奇怪字符

时间:2013-11-18 08:06:55

标签: php file-upload encoding character-encoding

我通过PHP将我的曲目上传到我的服务器,现在它在WinSCP中显示为:

Dubmood - Mario Airlines (Razor1911 Crysis​-​Keygen Edit).mp3

当我通过PuTTY运行ls -ls时,它通常显示为:

Dubmood - Mario Airlines (Razor1911 Crysis​-​Keygen Edit).mp3

PHP称之为:

Dubmood - Mario Airlines (Razor1911 Crysis?-?Keygen Edit).mp3

我不知道可能导致此问题的原因,我尝试使用

$_FILES['audiofile']['name'] = mb_convert_encoding($_FILES['audiofile']['name'], "UTF-8");

但这似乎没有做任何事情。

导致此问题的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:0)

这是因为php使用的是UTF-8。如果你的文件名有任何字符> = char(128)那么它将成为php中的两个(或更多)字节序列。所以你的名字包括 - 实际上是服务器上的一个字符。为了正确上传它,必须转换文件名(在php中)。 说我有一个字符串,我从我的网站输入: 我的代码然后被制作成我的代码 可以使用utf8_encode翻译成我的代码 你的文件系统(假设它是windows)运行在iso-8859-1 win win-1252或类似的东西上(假设你有一个现代的windows通常使用双字节字符)。 因此,您需要将文件名转换为符合您的服务器字符集的内容。您可以使用iconv。 当然,您也可以将其更改为iso-8859-1或任何其他代码页。

您的测试代码:

$s='Dit&is een+code#met%vreemdeÝ×tekens';
echo 'raw string:'.$s."\n";
echo 'filename_normal:'.filename_normal($s)."\n";
echo 'utf8-encode:'.utf8_encode($s)."\n";
echo 'iconv:'.iconv('UTF-8','ISO-8859-1//IGNORE',$s)."\n";
echo 'mb_internal_encoding:'.mb_internal_encoding();

这给出了以下输出

raw string:Dit&is een+code#met%vreemde▌╫tekens
Dit&is een+code#met%vreemde▌╫tekens
filename_normal:Dit en is een + code_met vreemde  tekens
utf8-encode:Dit&is een+code#met%vreemdeÝ×tekens
iconv:Dit&is een+code#met%vreemdetekens
mb_internal_encoding:ISO-8859-1

是的,我忘了filename_normal ..

function filename_normal($s)
{
  echo $s . "\n";
  $t='';
  for ($i=0;$i<strlen($s);$i++){
    if (ord(substr($s,$i,1))<32){
      $t=$t.' ';
    }elseif (ord(substr($s,$i,1))>127){
      $t=$t.' ';
    }elseif (substr($s,$i,1)=='&'){
      $t=$t.' en ';
    }elseif (substr($s,$i,1)=='+'){
      $t=$t.' + ';
    }elseif (substr($s,$i,1)=='%'){
      $t=$t.' ';
    }elseif (substr($s,$i,1)=='#'){
      $t=$t.'_';
    }else
      $t=$t.substr($s,$i,1);

  }
  return $t;
}

答案 1 :(得分:0)

所以它可能不是修复它的最好方法,但它对我有用

$s = preg_replace("([^a-zA-Z0-9-_. \(\)])", "", $s);