2013-05-26 48 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');