2010-04-16 21 views
13

preguntas relacionadas:Reemplazar caracteres diacríticos con ASCII "equivalente" en PHP?

  1. How to replace characters in a java String?
  2. How to replace special characters with their equivalent (such as " á " for " a") in C#?

Al igual que en las anteriores preguntas, estoy buscando una manera fiable, robusta para reducir cualquier carácter Unicode a ASCII casi equivalente usando PHP . Realmente quiero evitar rodar mi propia tabla de búsqueda.

Por ejemplo (robados de primera pregunta que se hace referencia): Gračišće se convierte en Gracisce

Respuesta

31

El módulo iconv puede hacer esto, más específicamente, la función iconv():

$str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce"); 
echo $str; 
//outputs "Gracisce" 

La principal molestia con iconv es que acabas de hav e para ver sus codificaciones, pero definitivamente es la herramienta correcta para el trabajo (utilicé 'Windows-1252' para el ejemplo debido a las limitaciones del editor de texto con el que estaba trabajando;) La característica de iconv que definitivamente quiere usar es la bandera //TRANSLIT, que le dice a iconv que transcriba cualquier carácter que no tenga una coincidencia ASCII en la aproximación más cercana.

+0

La transliteración ahora es mi palabra del día. – Dolph

+3

Tenga en cuenta que esto no funciona correctamente cuando la categoría local 'LC_CTYPE' está establecida en' C' o 'POSIX' (puede verificar cuál es su configuración regional con' echo setlocale (LC_ALL, 0); ').Todos los caracteres no ascii se convertirán a '?' S. En su lugar, primero deberá establecer la configuración regional en otra cosa: p. 'setlocale (LC_ALL," en_US.UTF-8 ")'. – Mike

+0

@Mike gracias por su pista. Si no fuera por ti, nunca podría haber resuelto ese problema. –

2

Mi solución es crear dos cadenas - primero con letras no deseados y la segunda con letras que reemplazarán primicias.

$from = 'čšć'; 
$to = 'csc'; 
$text = 'Gračišće'; 

$result = str_replace(str_split($from), str_split($to), $text); 
+2

"Realmente quiero evitar rodar mi propia tabla de búsqueda". – Dolph

+0

@Dolph: en este momento, esta es la respuesta más cercana a la realidad. todas las otras respuestas simplemente destruyen la cadena o no funcionan correctamente – machineaddict

1

Prueba esto:

function normal_chars($string) 
{ 
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8'); 
    $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', $string); 
    $string = preg_replace(array('~[^0-9a-z]~i', '~-+~'), ' ', $string); 
    return trim($string); 
} 

Examples: 

echo normal_chars('Álix----_Ãxel!?!?'); // Alix Axel 
echo normal_chars('áéíóúÁÉÍÓÚ'); // aeiouAEIOU 
echo normal_chars('üÿÄËÏÖÜŸåÅ'); // uyAEIOUYaA 

Basado en la respuesta seleccionada en este hilo: URL Friendly Username in PHP?

+2

+1, pero esto solo funciona para un subconjunto de casos. Por ejemplo, "Škoda" se convierte en "Scaron koda". – Dolph

1

Encontré otra solución, basada en la respuesta de @Zombat.

El problema con su respuesta fue que estaba recibiendo:

Notice: iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed in D:\www\phpcommand.php(11) : eval()'d code on line 3 

Y después de la eliminación de //IGNORE de la función, que tengo:

Gr'a'e~a~o^O"ucisce 

Por lo tanto, el carácter š fue traducido correctamente, pero los otros personajes no.

La solución que funcionó para mí es una mezcla entre preg_replace (para eliminar todo lo que no [a-zA-Z0-9] - incluyendo espacios) y solución de @ zombat:

preg_replace('/[^a-zA-Z0-9.]/','',iconv('UTF-8', 'ASCII//TRANSLIT', "GráéãõÔücišce")); 

Salida:

GraeaoOucisce 
Cuestiones relacionadas