Pregunta

Estoy tratando de hacer sustitución de caracteres acentuados en PHP, pero obtener resultados cobardes, siendo yo creo porque estoy usando una cadena UTF-8 y str_replace no pueda manejar adecuadamente cadenas multibyte ..

$accents_search     = array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'); 

$accents_replace    = array('a','a','a','a','a','a','a','A','A','A','A','A','e','e',
'e','e','E','E','E','E','i','i','i','i','I','I','I','I','oe','o','o','o','o','o','o',
'O','O','O','O','O','u','u','u','U','U','U','c','C','N','n'); 

$str = str_replace($accents_search, $accents_replace, $str);

Los resultados que obtienen:

Ørjan Nilsen -> �orjan Nilsen

Resultado esperado:

Ørjan Nilsen -> Orjan Nilsen

Edit: Tengo mi manejador de carácter interno establece en UTF-8 (de acuerdo con mb_internal_encoding ()), también el valor de $ cadena es UTF-8, por lo que a partir de lo que puedo decir, todas las cadenas involucradas son UTF -8. No str_replace () detectar conjuntos de carbonilla y utilizarlos de manera adecuada?

¿Fue útil?

Solución

Parece que la cadena no fue reemplazado debido a su codificación de entrada y la codificación del archivo desajuste.

Otros consejos

Según la documentación php str_replace función es binario-seguro, que significa que puede manejar UTF-8 texto codificado sin pérdida de datos.

Es posible eliminar los signos diacríticos utilizando Unicode forma normalización D (NFD) y de caracteres Unicode propiedades.

NFD convierte algo así como la diéresis "U" de "AMÉRICA LETRA U con diéresis" (que es una carta) para "AMÉRICA LETRA U" (letra) y "DIÉRESIS COMBINACIÓN" (no una letra).

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

$test = implode('', array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'));

$test = Normalizer::normalize($test, Normalizer::FORM_D);

// Remove everything that's not a "letter" or a space (e.g. diacritics)
// (see http://de2.php.net/manual/en/regexp.reference.unicode.php)
$pattern = '/[^\pL ]/u';

echo preg_replace($pattern, '', $test);

Salida:

aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn

La clase Normalizador es parte de la PECL paquete Intl . (El algoritmo en sí no es muy complicado, pero tiene que cargar una gran cantidad de asignaciones de carácter que yo sepa. Escribí un aplicación PHP hace un tiempo.)

(estoy añadiendo esto dos meses de retraso, porque creo que es una buena técnica que no se conoce ampliamente suficiente.)

Prueba esta definición de función:

if (!function_exists('mb_str_replace')) {
    function mb_str_replace($search, $replace, $subject) {
        if (is_array($subject)) {
            foreach ($subject as $key => $val) {
                $subject[$key] = mb_str_replace((string)$search, $replace, $subject[$key]);
            }
            return $subject;
        }
        $pattern = '/(?:'.implode('|', array_map(create_function('$match', 'return preg_quote($match[0], "/");'), (array)$search)).')/u';
        if (is_array($search)) {
            if (is_array($replace)) {
                $len = min(count($search), count($replace));
                $table = array_combine(array_slice($search, 0, $len), array_slice($replace, 0, $len));
                $f = create_function('$match', '$table = '.var_export($table, true).'; return array_key_exists($match[0], $table) ? $table[$match[0]] : $match[0];');
                $subject = preg_replace_callback($pattern, $f, $subject);
                return $subject;
            }
        }
        $subject = preg_replace($pattern, (string)$replace, $subject);
        return $subject;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top