2010-04-16 11 views
13

domande correlate:Sostituisci caratteri diacritici con ASCII "equivalente" in 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#?

Come nelle domande di cui sopra, sto cercando un modo robusto affidabile per ridurre qualsiasi carattere Unicode in ASCII quasi equivalente utilizzando PHP . Voglio davvero evitare di girare il mio tavolo di ricerca.

Per esempio (rubato dalla prima domanda si fa riferimento): Gračišće diventa Gracisce

risposta

31

Il modulo iconv può fare questo, più specificamente, la funzione iconv():

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

La scocciatura principale con iconv è che hai appena e per vedere le tue codifiche, ma è sicuramente lo strumento giusto per il lavoro (ho usato 'Windows-1252' per l'esempio a causa delle limitazioni dell'editor di testo con cui stavo lavorando;) La funzionalità di iconv che si vuole assolutamente usare è il flag //TRANSLIT, che indica a iconv di convertire i caratteri che non hanno una corrispondenza ASCII nell'approssimazione più vicina.

+0

La traslitterazione è ora la mia parola del giorno. – Dolph

+3

Nota, questo non funziona correttamente quando la categoria locale 'LC_CTYPE' è impostata su' C' o 'POSIX' (puoi verificare quale sia la tua localizzazione con' echo setlocale (LC_ALL, 0); ').Tutti i caratteri non-ascii saranno convertiti in '?' S. Invece, dovrai prima impostare le impostazioni locali su qualcos'altro: ad es. 'setlocale (LC_ALL," en_US.UTF-8 ")'. – Mike

+0

@Mike grazie per il tuo suggerimento. Se non fosse per te, forse non avrei mai risolto quel problema. –

2

La mia soluzione è quella di creare due stringhe - prima con le lettere non voluto e la seconda con le lettere che sostituiranno primati.

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

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

"Voglio davvero evitare di aprire il mio tavolo di ricerca." – Dolph

+0

@Dolph: in questo momento, questa è la risposta più vicina alla realtà. tutte le altre risposte distruggono semplicemente la stringa o non funzionano correttamente – machineaddict

1

Prova questo:

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 

Sulla base della risposta selezionata in questa discussione: URL Friendly Username in PHP?

+2

+1, ma funziona solo per un sottoinsieme di casi. Ad esempio, "Škoda" diventa "Scaron koda". – Dolph

1

Ho trovato un'altra soluzione, basata sulla risposta di @ zombat.

Il problema con la sua risposta è stata che mi è stato sempre:

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 

E dopo aver rimosso //IGNORE dalla funzione, ho ottenuto:

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

Così, il personaggio š è stato tradotto in modo corretto, ma gli altri personaggi non lo erano.

La soluzione che ha funzionato per me è un mix tra preg_replace (per rimuovere tutto ma [a-zA-Z0-9] - spazi inclusi) e la soluzione @ di zombat:

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

uscita:

GraeaoOucisce 
Problemi correlati