2011-09-14 13 views
12

Estoy tratando de convertir texto de Word pegado por usuarios que contienen puntos suspensivos de MS Word y guiones largos antes de procesarlo más.Conversión de caracteres especiales de Microsoft Word con PHP

Encontré una vieja solución propuesta aquí para el problema http://www.codingforums.com/archive/index.php/t-47163.html, pero no funciona para mí. Después de reemplazar las elipsis, por ejemplo, la variable vuelve como vacía. Nunca antes visto algo como esto:

$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; 

¿Alguna idea?

+0

Véase mi respuesta a ** [esta cuestión] (http://stackoverflow.com/questions/6698785/modify-simplify-topic-title-for-displaying-in-url) **. No cubrirá todos los escenarios, pero debería manejar los más comunes. – simshaun

+0

Me di cuenta de que la codificación de mi archivo php era ANSI, y mysql también tenía codificación general no utf8. Corrigiendo estos, mi función y la de abajo funcionan. Muy apreciado por todos. – giorgio79

Respuesta

30

Para alguien que recibe el signo de interrogación de diamantes en PHP, este método de sustitución de caracteres UTF-8 funcionó mejor que usar la función 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

Amigo, gracias. No sé lo que está pasando con ninguna de las bibliotecas de análisis de HTML, pero todos parecen escupir reemplazos desagradables de personajes ... Creo que suponen que el juego de caracteres es ISO-8859-1 de forma predeterminada – Funktr0n

+0

Gracias Verron! Me acabo de dar cuenta de que la url del formato de archivo debe ser www.fileformat.info/info/unicode/char/ / – user697576

+0

¡Felizmente podría ayudar! Ninguna de las otras soluciones funcionaba% 100, así que pensé que compartiría. –

8

Hmm. Utilizo esta función para desinfectar el texto copiado en un RTE. Puede o no funcionar en este caso. Convierte a entidades HTML, pero puede modificarlo para convertir a caracteres normales:

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

Gran solución. Lo copié y pegué y funcionó sin problema. En un estudio posterior, agregué algunos caracteres que no estaban en la matriz de búsqueda y reemplazo. Con el fin de encontrar los números de identificación de caracteres ASCII, escribí una función PHP que muestra lo que el número de caracteres ASCII es:

function stdump($s){ 

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

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

    } 

    echo "<br/>"; 
} 

El personaje es pantalla y junto a ella el número ascıı se muestran entre paréntesis. De esta manera:

echo stdump ("GPUs ...");

produce:

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

Hope esto ayuda.

--Keith

Cuestiones relacionadas