Domanda

Un sito web Ho recentemente completato con un amico ha una galleria dove si possono caricare immagini e file di testo. Il file di testo unico accettato (per lo sviluppo facilità) è .txt e normalmente si spegne senza un intoppo (o no ..)

I problemi che ho incontrato sono gli stessi di tutti gli sviluppatori:. ASCII esteso di Microsoft

Prima di emettere il testo dal file, vado su più livelli diversi per cercare di ripulirlo:

$txtfile = file_get_contents(".".$this->var['submission']['file_loc']);

// BOM Fun
    $boms = array
    (
        "utf8"    => array(3,pack("CCC",0xEF,0xBB,0xBF)),
        "utf16be"       => array(2,pack("CC",0xFE,0xFF)),
        "utf16le"       => array(2,pack("CC",0xFF,0xFE)),
        "utf32be"       => array(4,pack("CCCC",0x00,0x00,0xFE,0xFF)),
        "utf32le"       => array(4,pack("CCCC",0xFF,0xFE,0x00,0x00)),
        "gb18030"       => array(4,pack("CCCC",0x84,0x31,0x95,0x33))
    );
    foreach($boms as $bom)
    {
        if(mb_substr($txtfile,0,$bom[0]) == $bom[1])
        {
            $txtfile = substr($txtfile,$bom[0]);
            break;
        }
    }
$txtfile_o = $txtfile;
$badwords = array(chr(145),chr(146),chr(147),chr(148),chr(151),chr(133));
$fixwords = array("'","'",'"','"','-','...');
$txtfile_o = str_replace($badwords,$fixwords,$txtfile_o);
$txtfile_o = mb_convert_encoding($txtfile_o,"UTF-8");

Lo str_replace è il metodo generale di conversione di citazioni di Microsoft terribili intelligenti, em-dash, ei puntini di sospensione nelle loro normali equivalenti ASCII per l'uscita.

Questo codice funziona perfettamente trovare a condizione che il file caricato è ANSI / us-ascii.

Questo codice non funziona (per nessun motivo particolare) quando il file caricato è UTF-8.

Quando il file è UTF-8, la visualizzazione del file stesso nel browser web funziona bene, ma la stampa fuori tramite l'interfaccia web utilizzando questo codice non lo fa. In tal caso, le virgolette diventano una sorta di accentuato carattere.

Questo è dove mi sono bloccato. L'uscita di codifica per la pagina web è UTF-8, il browser web vede come UTF-8, il file è in UTF-8 e tuttavia né la sostituzione della smart citazioni opere né la visualizzazione del browser Web in modo corretto.

Qualsiasi aiuto su questo sarebbe molto apprezzato.

È stato utile?

Soluzione

Se ho capito bene il vostro problema è che il codice che sostituisce caratteri "esteso ASCII" per le loro controparti ASCII non riesce Quando l'utente invia un file in UTF-8.

Questo era prevedibile. Non è possibile utilizzare il file UTF-8 con str_replace e simili, che operano a livello di byte, mentre un personaggio in UTF-8 è costituito da un byte solo per caratteri nell'intervallo ASCII.

Quello che mi consiglia di fare è quello di utilizzare alcuni euristico per determinare se il file è codificato in UTF-8 (il BOM è un buon modo, se sei sicuro che sarà presente) o Windows-1252 o qualsiasi altra cosa e quindi convertirlo in UTF-8 se non lo è. In tal caso, non avrebbe bisogno di sostituire tutti i caratteri, è possibile conservare le virgolette.

Altri suggerimenti

I caratteri che si sta cercando di sostituire avere valori di byte differenti in UTF8. In realtà, essi hanno più di un byte ciascuno in UTF8. Si sta tentando di cercare per loro con Windows che codificano i valori ed è per questo che non li troverete.

Cercare le sequenze di byte UTF-8 dei personaggi e utilizzarli per la ricerca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top