通过PHP上传后,文件名在FTP中包含奇怪的字符


Filename contains weird characters in FTP after uploading via PHP

我通过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");

但这似乎没有任何作用。

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

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

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

这是由于 php 使用 UTF-8 造成的。如果你的文件名有任何字符>=char(128),那么它将在php中变成一个两个(或更多)字节的序列。因此,您的名字由"€"组成,它实际上是服务器上的一个字符。为了正确上传它,必须转换文件名(在 php 中)。假设我有一个从我的网站输入的字符串:我的代码然后被制作成我的代码可以使用utf8_encode将其转换为我的代码您的文件系统(假设它是Windows)在iso-8859-1 win win-1252或类似的东西上运行(通常使用双字节字符,假设您有一个现代窗口)。因此,您需要将文件名转换为符合服务器字符集的内容。你可以使用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;
}