2010-04-05 9 views
5

Quando sto provando a scaricare un file il cui nome ha caratteri da lingue come il giapponese cinese ecc ... non ascii ... il scaricato il nome del file è confuso. Come correggerlodurante il download dei nomi file da lingue diverse dall'inglese non vengono visualizzati correttamente sul file scaricato

Ho provato a inserire charset = UTF-8 nella proprietà dell'intestazione Content-type, ma non ha avuto successo. Per favore aiuto. Codice sotto.

intestazione ("Cache-Control: "); // lasciare vuoto per evitare errori di IE

intestazione (" Pragma: "); // lasciare vuoto per evitare errori di IE

header (" Content -type: application/octet-stream ");

intestazione ("Content-Disposition: attachment; filename = \" ". $ Instance_name." \ "");

intestazione ("Lunghezza contenuto:". (Stringa) (fileize ($ fileString)));

sleep (1);

fpassthru ($ fdl);

+1

Si prega di aggiungere alcune informazioni di base. Da dove proviene '$ fileString'? In che cosa consiste la codifica? –

+0

la variabile viene prelevata dal database e utilizzata. sia instance_name che filestring – pks83

risposta

9

Sfortunatamente non esiste attualmente una soluzione singola che funzioni con tutti i browser. Ci sono almeno tre approcci "più ovvi" al problema.

una) Content-type: application/octet-stream; charset=utf-8 + filename=<utf8 byte sequence>
esempio filename=Москва.txt
Questa è una violazione degli standard ma firefox mostra correttamente il nome. IE no.

b) Content-type: application/octet-stream; charset=utf-8 + filename=<urlencode(utf8 byte sequence)>
ad es. filename=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.txt
Questo funziona con IE ma non con Firefox.

c) fornire il nome come specificato in rfc 2231
es filename*=UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.txt
nuovamente Firefox supporta questo, IE non lo fa.

per un confronto più completo vedere http://greenbytes.de/tech/tc2231/


edit: Quando ho detto che non esiste un'unica soluzione, volevo dire con un colpo di testa ('...'). Ma c'è qualcosa in giro.
Quando non esiste un nome file utilizzabile = i browser di intestazione xyz utilizzano il nome di base della parte del percorso dell'URL. Cioè per <a href="test.php/lala.txt"> sia firefox che IE suggeriscono lalala.txt come nome file.
È possibile aggiungere componenti del percorso extra dopo il percorso effettivo del proprio script php (quando si utilizza l'httpd di apache vedere http://httpd.apache.org/docs/2.1/mod/core.html#acceptpathinfo).
E.g. se hai un file test.php nella root del documento e lo richiedi come http://localhost/test.php/x/y/z la variabile $_SERVER['PATH_INFO'] conterrà /x/y/z.
Ora, se si mette un link come

<a 
    href="/test.php/download/moskwa/&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;" 
> 
    &#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430; 
</a> 

nel documento è possibile recuperare la parte download/moskwa/... ed avviare il download del file. Senza inviare alcun nome file = ... informazioni sia firefox che IE suggeriscono il nome "giusto".
Puoi anche combinarlo con l'invio del nome in base a rfc 2231. Ecco perché ho anche inserito moskwa nel link. Quello sarebbe l'id che lo script usa per trovare il file che dovrebbe inviare. L'IE ignora le informazioni filename*=... e utilizza ancora la parte basename dell'URL per suggerire un nome. Ciò significa che per firefox (e qualsiasi altro client che supporta rfc 2231) la parte dopo l'id non ha senso * ma per IE (e altri client che non supportano rfc 2231) verrebbe utilizzato per il suggerimento del nome.
self-contained esempio:

<?php // test.php 
$files = array(
    'moskwa'=>array(
    'htmlentities'=>'&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;', 
    'content'=>'55° 45′ N, 37° 37′ O' 
), 
    'athen'=>array(
    'htmlentities'=>'&#x391;&#x3b8;&#x3ae;&#x3bd;&#x3b1;', 
    'content'=>'37° 59′ N, 23° 44′ O' 
) 
); 


$fileid = null; 
if (isset($_SERVER['PATH_INFO']) && preg_match('!^/download/([^/]+)!', $_SERVER['PATH_INFO'], $m)) { 
    $fileid = $m[1]; 
} 

if (is_null($fileid)) { 
    foreach($files as $fileid=>$bar) { 
    printf(
     '<a href="./test.php/download/%s/%s.txt">%s</a><br />', 
     $fileid, $bar['htmlentities'], $bar['htmlentities'] 
    ); 
    } 
} 
else if (!isset($files[$fileid])) { 
    echo 'no such file'; 
} 
else { 
    $f = $files[$fileid]; 
    $utf8name = mb_convert_encoding($f['htmlentities'], 'utf-8', 'HTML-ENTITIES'); 
    $utf8name = urlencode($utf8name); 

    header("Content-type: text/plain"); 
    header("Content-Disposition: attachment; filename*=UTF-8''$utf8name.txt"); 
    header("Content-length: " . strlen($f['content'])); 
    echo $f['content']; 
} 

*) Questo è un po 'come qui su Stack Overflow. Il link per questa domanda è indicato come

http://stackoverflow.com/questions/2578349/while-downloading-filenames-from-non-english-languages-are-not-getting-displayed 

ma funziona anche con

http://stackoverflow.com/questions/2578349/mary-had-a-little-lamb 

la parte importante è l'ID 2578349

+0

+1 la risposta migliore che abbia mai visto sul problema. Grazie per il link. Questo va nella mia scatola dei preferiti. –

+0

Grazie per aver fornito la spiegazione dettagliata, mi è stato di grande aiuto nella comprensione della questione. Grazie – pks83

+0

Hi VolkerK, Qualsiasi input su come gestire Safari? – pks83

0

Penso che se si tenta di aggiungere altro set di caratteri si risolverà il problema.

se il proplem ancora penso che è necessario installare lingue file dal CD di XP al sistema, perché se il sistema non riesce a trovare i caratteri giusti, si aggiungerà quelle dispari.

Avevo un programma simile con il linguaggio arabo ma trovo che non ho copiato tutti i file di lingua sul mio sistema.

Spero che questo ti possa aiutare.

Problemi correlati