2013-05-26 10 views
7

Sarò breve. La mia funzione FTP restituisce la codifica dei nomi dei file sbagliatoPHP - Problema di codifica del nome file 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" 
    } 

Il nome del file ha la codifica di Windows-1251.

Ho provato a collegarmi a FTP tramite nodejs ma restituisce anche qualcosa di raccapricciante - òð.txt.

Il mio client desktop (WinSCP) tuttavia funziona correttamente con questo.

PS: Ho provato a utilizzare utf8_encode, ma anche questo non funziona per me.

+1

Cosa succede se si aggiunge un'intestazione ('Content-Type: text/html; charset = windows-1251'); alla tua sceneggiatura? – herrjeh42

+0

@ jamie0726, buon suggerimento! Inoltre ha restituito il risultato con la codifica corretta. Sarebbe un'ottima soluzione nel caso in cui avessi bisogno di trasferire file con una codifica specifica. Ma per me è necessario rilevare automaticamente la codifica di ogni file. – artnikpro

+0

ho questo problema, come risolvere questo problema? – user3770797

risposta

9

Se la codifica è di voi, provare a modificarlo utilizzando mb_convert_encoding. Il codice qui sotto dovrebbe fornire il valore corretto.

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

Se non funziona, si può provare a trovare la giusta codifica usando qualcosa come

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

Grazie Hugo, questo 'mb_convert_encoding ($ buff [0]," UTF-8 "," windows-1251 ");' funziona per me ma solo nel caso in cui il nome del file sia in codifica Windows-1251. Ma potrebbe anche essere qualsiasi altra codifica, quindi c'è un modo affidabile per rilevarlo automaticamente? Ho provato a usare 'mb_detect_encoding' ma non restituisce la codifica corretta :( – artnikpro

+0

controlla http://stackoverflow.com/questions/910793/detect-encoding-and-make-everything-utf-8 per una risposta esauriente su Cambiare la codifica in utf-8 –

+0

@artnikpro Perché pensi che potrebbe essere un'altra codifica? La stessa macchina non ha una sola codifica? Perché se non lo è, allora ottieni solo byte (al contrario dei caratteri) e non c'è un modo sicuro per dire di cosa si tratta, potrebbe anche essere una codifica di un cane per tutto ciò che conosci. E anche se ha senso analizzare ogni carattere come un carattere cirillico in qualche codifica, non lo sai per certo (a meno che è una parola reale in una lingua, ma chi ha tutti quei dizionari) Quindi, quello che sto dicendo è che questa è la migliore risposta che otterrete come ciò che (probabilmente) state pensando è impossibile. – inkredibl

1

Prima di aggiungere il tipo di contenuto sulla tua pagina.

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

E allora provate questo, speriamo vi sia utile

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

Non è il modo migliore, ma funziona per me, se l'URL di codificare una stringa cambia i personaggi scomodi in es % 82 ... Puoi quindi sostituirli con i codici HTML.

0

puoi provare a utilizzare la funzione iconv. Sperando che risolva il tuo problema.

1

Molti (ma non tutti) i server ftp supportano la codifica dei percorsi dei percorsi UTF-8. È possibile attivare questa funzione emettendo il comando 'OPTS UTF8 ON' prima della chiamata ftp_nlist.

ftp_raw('OPTS UTF8 ON');