我通过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");
但这似乎没有做任何事情。
导致此问题的原因是什么?如何解决?
答案 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);