2010-04-16 9 views
13

Powiązane pytania:Zamień znaki diakrytyczne na "odpowiednik" ASCII w 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#?

jak w powyższych pytaniach, szukam wiarygodnego i solidnego sposób do zmniejszenia dowolny znak Unicode do niemal równoważną ASCII za pomocą PHP . Naprawdę chcę uniknąć przewracania się na własnym stole.

Na przykład (skradziony od 1 wskazanej pytanie): Gračišće staje Gracisce

Odpowiedz

31

Moduł iconv można to zrobić, a dokładniej z iconv() funkcję:

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

Głównym problemem z iconv jest to, że po prostu hav e do obejrzenia kodowania, ale jest to z pewnością właściwe narzędzie do pracy (użyłem "Windows-1252" na przykład ze względu na ograniczenia edytora tekstu, z którym pracowałem;) Cechą iconv, którą na pewno chcesz użyć, jest: flaga //TRANSLIT, która nakazuje iconv transliterację dowolnych znaków, które nie mają zgodności ASCII, do najbliższego przybliżenia.

+0

Transliteracja jest teraz moim słowem dnia. – Dolph

+3

Uwaga, to nie działa poprawnie, gdy kategoria loci 'LC_CTYPE' jest ustawiona na' C' lub 'POSIX' (możesz sprawdzić, jakie są twoje ustawienia narodowe z' echo setlocale (LC_ALL, 0); ').Wszystkie znaki spoza ASC będą konwertowane na '?' S. Zamiast tego musisz najpierw ustawić ustawienia regionalne na coś innego: np. 'setlocale (LC_ALL," en_US.UTF-8 ")'. – Mike

+0

@Mike dzięki za podpowiedź. Gdyby nie Ty, mógłbym nigdy nie rozwiązać tego problemu. –

2

Moje rozwiązaniem jest utworzenie dwóch ciągów - najpierw nie chcieli liter i drugi z literami, które zastąpią nowatorskich rozwiązań.

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

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

"Naprawdę chcę uniknąć przewracania się przy własnym stole". – Dolph

+0

@Dolph: teraz jest to najbliższa odpowiedź na rzeczywistość. wszystkie inne odpowiedzi po prostu niszczą ciąg znaków lub nie działają poprawnie – machineaddict

1

Spróbuj tego:

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 

oparciu o wybraną odpowiedź w tym wątku: URL Friendly Username in PHP?

+2

+1, ale działa to tylko dla podzbioru przypadków. Na przykład "Škoda" staje się "Scaron koda". – Dolph

1

Znalazłem inne rozwiązanie, oparte na odpowiedzi @ zombata.

Problem z jego odpowiedzią było to, że był już:

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 

i po usunięciu //IGNORE z funkcji, mam:

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

Tak, postać š został prawidłowo przetłumaczone, ale inne postacie nie były.

Rozwiązanie że pracował dla mnie to mieszanka preg_replace (aby usunąć wszystko, ale [a-zA-Z0-9] - włącznie ze spacjami) i rozwiązanie @ zombat za:

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

wyjściowa:

GraeaoOucisce 
Powiązane problemy