2013-05-26 52 views
7

我将简要介绍一下。我的FTP函数返回的文件名PHP - FTP文件名编码问题

$conn_id = ftp_connect("site.com"); 
ftp_login($conn_id, "login", "pass"); 
ftp_pasv($conn_id, true); 
$buff = ftp_nlist($conn_id, "./"); 
print_r($buff); 

-> // result 
    array() { 
     [0]=> "��.txt" 
    } 

的错误的编码文件名中有Windows的1251编码。

我试图通过nodejs连接到FTP,但它也返回令人毛骨悚然的东西 - òð.txt

但是,我的桌面客户端(WinSCP)正常工作。

PS:我试图使用utf8_encode - 但这也不适合我。

+1

如果添加标题('Content-Type:text/html; charset = windows-1251'),会发生什么?到你的脚本? – herrjeh42

+0

@ jamie0726,不错的建议!它也返回了正确编码的结果。如果我需要使用特定的编码传输文件,这将是一个很好的解决方案。但对我来说,自动检测每个文件的编码是必要的。 – artnikpro

+0

我有这个问题,如何解决这个问题? – user3770797

回答

9

如果编码是你可以尝试改变它使用mb_convert_encoding。下面的代码应该输出正确的值。

<?php 
echo mb_convert_encoding($buff[0], "UTF-8"); 
//or 
echo mb_convert_encoding($buff[0], "UTF-8", "windows-1251"); 
?> 

如果它不工作,你可以尝试找到使用的东西正确的编码就像

<?php 
foreach(mb_list_encodings() as $chr){ 
    echo mb_convert_encoding($buff[0], 'UTF-8', $chr)." : ".$chr."<br>"; 
} 
?> 
+0

感谢Hugo,这个mb_convert_encoding($ buff [0],“UTF-8”,“windows-1251”);'适用于我,但只有在文件名为windows-1251编码的情况下。但它也可以是任何其他编码,所以有一些可靠的方法来自动检测它?我尝试使用'mb_detect_encoding',但它不返回正确的编码:( – artnikpro

+0

检查http://stackoverflow.com/questions/910793/detect-encoding-and-make-everything-utf-8广泛的答案改变编码为UTF-8 –

+0

@artnikpro为什么你认为它可以是任何其他编码?不是同一台机器只有一个编码?因为如果它不是,那么你只是得到字节(而不是字符)和没有确切的方法来说明它是什么,它甚至可能是一些你知道的狗编码,即使它在某些编码中将每个字符解析为一些西里尔字符都有意义,但你仍然不知道(除非这是一个真正的词,但是谁拥有所有这些词典)所以我要说的是,这是你得到的最好的答案,因为你(可能)所想的是不可能的 – inkredibl

1

首先您的网页上添加内容类型。

header('Content-Type: text/html; charset=utf-8'); 

再试试这个,希望它有助于

str_replace(array('%82','%94','+'),array('&#233;','&#246;',' '),urlencode($folder_name)); 

这是不是最好的方式,但它为我工作,如果你的URL编码它改变了尴尬的字符到如字符串%82 ...然后您可以用HTML代码替换它们。

0

你可以尝试使用iconv函数。希望它能解决你的问题。

1

许多(但不是全部)ftp服务器都支持UTF-8路径名编码。您可以通过在拨打ftp_nlist之前发出'OPTS UTF8 ON'命令来开启此功能。

ftp_raw('OPTS UTF8 ON');