2011-09-14 13 views
12

Sto cercando di convertire il testo di Word incollato dagli utenti che contengono ellissi di MS Word e trattino lungo prima di elaborarlo ulteriormente.Conversione di caratteri speciali di Microsoft Word con PHP

Ho trovato una vecchia soluzione proposta qui per il problema http://www.codingforums.com/archive/index.php/t-47163.html, ma non funziona per me. Ad esempio, dopo aver sostituito i puntini di sospensione, la variabile torna vuota. Mai visto nulla di simile prima:

$src = "Long word dash – and weird Word ellipsis…"; 
$src = str_replace("‘", "'", $src); 
$src = str_replace("’", "'", $src); 
$src = str_replace("”", '"', $src); 
$src = str_replace("“", '"', $src); 
$src = str_replace("–", "-", $src); 
$src = str_replace("…", "...", $src); 
print $src; 

Qualche idea?

+0

Vedere la mia risposta su ** [questa domanda] (http://stackoverflow.com/questions/6698785/modify-simplify-topic-title-for-displaying-in-url) **. Non coprirà tutti gli scenari, ma dovrebbe gestire quelli più comuni. – simshaun

+0

Mi sono reso conto che la codifica del mio file php era ANSI, e mysql aveva anche una codifica generale non utf8. Correggendoli, la mia funzione e quella sotto funzionano entrambi. Molto apprezzato da tutti. – giorgio79

risposta

30

Per chiunque ricevendo il punto interrogativo diamante in PHP, questo metodo di sostituzione di caratteri UTF-8 ha funzionato meglio che usare la funzione chr.

$search = [     // www.fileformat.info/info/unicode/<NUM>/ <NUM> = 2018 
       "\xC2\xAB",  // « (U+00AB) in UTF-8 
       "\xC2\xBB",  // » (U+00BB) in UTF-8 
       "\xE2\x80\x98", // ‘ (U+2018) in UTF-8 
       "\xE2\x80\x99", // ’ (U+2019) in UTF-8 
       "\xE2\x80\x9A", // ‚ (U+201A) in UTF-8 
       "\xE2\x80\x9B", // ‛ (U+201B) in UTF-8 
       "\xE2\x80\x9C", // “ (U+201C) in UTF-8 
       "\xE2\x80\x9D", // ” (U+201D) in UTF-8 
       "\xE2\x80\x9E", // „ (U+201E) in UTF-8 
       "\xE2\x80\x9F", // ‟ (U+201F) in UTF-8 
       "\xE2\x80\xB9", // ‹ (U+2039) in UTF-8 
       "\xE2\x80\xBA", // › (U+203A) in UTF-8 
       "\xE2\x80\x93", // – (U+2013) in UTF-8 
       "\xE2\x80\x94", // — (U+2014) in UTF-8 
       "\xE2\x80\xA6" // … (U+2026) in UTF-8 
    ]; 

    $replacements = [ 
       "<<", 
       ">>", 
       "'", 
       "'", 
       "'", 
       "'", 
       '"', 
       '"', 
       '"', 
       '"', 
       "<", 
       ">", 
       "-", 
       "-", 
       "..." 
    ]; 

    str_replace($search, $replacements, $string); 
+0

Amico, grazie. Non so cosa stia succedendo con nessuna delle librerie di analisi HTML, ma sembrano tutte sputare per rimpiazzare le sostituzioni di personaggi ... Penso che assumano che il set di caratteri sia ISO-8859-1 di default – Funktr0n

+0

Grazie Verron! Ho appena notato che l'URL del fileformat dovrebbe essere www.fileformat.info/info/unicode/char/ / – user697576

+0

Felice potrei aiutarti! Nessuna delle altre soluzioni stava funzionando su 100, quindi ho pensato che avrei condiviso. –

8

Hmm. Io uso questa funzione per disinfettare il testo copiato in un RTE. Potrebbe o potrebbe non funzionare in questo caso. Converte in entità HTML, ma puoi modificarlo per convertirlo in caratteri normali:

function convertFromCP1252($string) 
{ 
    $search = array('&', 
        '<', 
        '>', 
        '"', 
        chr(212), 
        chr(213), 
        chr(210), 
        chr(211), 
        chr(209), 
        chr(208), 
        chr(201), 
        chr(145), 
        chr(146), 
        chr(147), 
        chr(148), 
        chr(151), 
        chr(150), 
        chr(133), 
        chr(194) 
       ); 

    $replace = array( '&amp;', 
         '&lt;', 
         '&gt;', 
         '&quot;', 
         '&#8216;', 
         '&#8217;', 
         '&#8220;', 
         '&#8221;', 
         '&#8211;', 
         '&#8212;', 
         '&#8230;', 
         '&#8216;', 
         '&#8217;', 
         '&#8220;', 
         '&#8221;', 
         '&#8211;', 
         '&#8212;', 
         '&#8230;', 
         '' 
        ); 

    return str_replace($search, $replace, $string); 
} 
5

Ottima soluzione. L'ho copiato e incollato e ha funzionato senza alcun problema. Per ulteriori approfondimenti, ho aggiunto alcuni caratteri che non erano nella ricerca e nella sostituzione dell'array. Al fine di trovare i numeri di caratteri ASCII id, ho scritto una funzione PHP che mostra ciò che il numero di caratteri ASCII è:

function stdump($s){ 

    for($i=0;$i<strlen($s);$i++){ 

    echo substr($s,$i,1) . "(" . ord(substr($s,$i,1)) . ")"; 

    } 

    echo "<br/>"; 
} 

Il personaggio è di visualizzazione e accanto ad essa il numero ascii è spettacolo in parentesi. In questo modo:

echo stdump ("GPUs ||");

produce:

G (71) P (80) U (85) s (115) a (226) € (128) | (166)

speranza che questo aiuti.

--Keith