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