2010-04-16 9 views
13

Verwandte Fragen:Diakritische Zeichen durch "äquivalentes" ASCII in PHP ersetzen?

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

Wie in den oben genannten Fragen, ich bin auf der Suche nach einem zuverlässigen, robusten Art und Weise jedes Unicode-Zeichen zu nahezu äquivalente ASCII zu reduzieren PHP . Ich möchte wirklich vermeiden, meine eigene Nachschlagetabelle zu rollen.

Zum Beispiel (vom 1. referenzierten Frage gestohlen): Gračišće werden Gracisce

Antwort

31

Das iconv Modul kann dies tun, genauer gesagt, die iconv() Funktion:

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

Der größte Ärger mit iconv ist, dass Sie nur hav Das ist definitiv das richtige Werkzeug für den Job (ich habe 'Windows-1252' für das Beispiel verwendet, aufgrund der Einschränkungen des Texteditors, mit dem ich gearbeitet habe;) Die Funktion von iconv, die Sie definitiv verwenden möchten, ist das Flag //TRANSLIT, das iconv anweist, alle Zeichen, die keine ASCII-Übereinstimmung haben, in die engste Annäherung zu transkribieren.

+0

Transliteration ist jetzt mein Wort des Tages. – Dolph

+3

Beachten Sie, dass dies nicht korrekt funktioniert, wenn die Gebietsschema-Kategorie 'LC_CTYPE' auf' C' oder 'POSIX' gesetzt ist (Sie können überprüfen, wie Ihr Gebietsschema mit' echo setlocale (LC_ALL, 0); ') ist.Alle nicht-ASCII-Zeichen werden in '?' S umgewandelt. Stattdessen müssen Sie das Gebietsschema zuerst auf etwas anderes einstellen: z. 'setlocale (LC_ALL," en_US.UTF-8 ")'. – Mike

+0

@ Mike danke für Ihren Hinweis. Wenn nicht für Sie, hätte ich dieses Problem vielleicht nie gelöst. –

2

Meine Lösung zwei Strings zu erstellen ist - zunächst mit nicht gesucht Buchstaben und zweiter mit Buchstaben, die Premieren ersetzen wird.

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

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

"Ich möchte wirklich vermeiden, meine eigene Nachschlagetabelle zu rollen." – Dolph

+0

@Dolph: Im Moment ist dies die nächste Antwort auf die Realität. alle anderen Antworten zerstören nur die Zeichenfolge oder sie funktionieren nicht richtig – machineaddict

1

Versuchen Sie folgendes:

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 

Basierend auf der gewählten Antwort in diesem Thread: URL Friendly Username in PHP?

+2

+1, aber das funktioniert nur für eine Teilmenge von Fällen. Zum Beispiel wird "Škoda" zu "Scaron koda". – Dolph

1

Ich fand eine andere Lösung, basierend auf @ zombats Antwort.

Das Problem mit seiner Antwort war, dass ich immer:

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 

Und nach //IGNORE aus der Funktion zu entfernen, ich habe:

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

Also, die š Zeichen korrekt übersetzt, aber die anderen Charaktere waren nicht.

Die Lösung, die für mich gearbeitet ist eine Mischung zwischen preg_replace (alles zu entfernen, aber [a-zA-Z0-9] - inklusive Leerzeichen) und Lösung von @ zombat:

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

Ausgang:

GraeaoOucisce