2010-04-16 7 views
13

questions connexes:Remplacer les caractères diacritiques par des caractères ASCII "équivalents" 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#?

Comme dans les questions ci-dessus, je suis à la recherche d'un moyen fiable et robuste pour réduire tout caractère unicode ASCII quasi équivalent en utilisant PHP . Je veux vraiment éviter de rouler ma propre table de consultation.

Par exemple (1ère question de volée de référence): Gračišće devient Gracisce

Répondre

31

Le module iconv peut le faire, plus précisément, la fonction iconv():

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

La dispute principale avec iconv est que vous avez juste hav e pour regarder vos encodages, mais c'est certainement le bon outil pour le travail (j'ai utilisé 'Windows-1252' pour l'exemple en raison des limitations de l'éditeur de texte avec lequel je travaillais;) La fonctionnalité d'iconv que vous voulez absolument utiliser est l'indicateur //TRANSLIT, qui indique à iconv de translittérer tous les caractères qui n'ont pas de correspondance ASCII dans l'approximation la plus proche.

+0

La translittération est maintenant ma parole du jour. – Dolph

+3

Notez que cela ne fonctionne pas correctement lorsque la catégorie locale LC_CTYPE est définie sur C ou POSIX (vous pouvez vérifier vos paramètres régionaux avec echo setlocale (LC_ALL, 0);).Tous les caractères non-ascii seront convertis en '?' Au lieu de cela, vous devrez d'abord définir les paramètres régionaux sur autre chose: par exemple. 'setlocale (LC_ALL," en_US.UTF-8 ")'. – Mike

+0

@Mike merci pour votre indice. Si ce n'est pas pour vous, je n'aurais peut-être jamais résolu ce problème. –

2

Ma solution est de créer deux chaînes - d'abord avec des lettres pas voulu et deuxième avec des lettres qui remplaceront premières.

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

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

"Je veux vraiment éviter de rouler ma propre table de consultation." – Dolph

+0

@Dolph: en ce moment, c'est la réponse la plus proche de la réalité. toutes les autres réponses détruisent simplement la chaîne ou ne fonctionnent pas correctement – machineaddict

1

Essayez ceci:

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 

Sur la base de la réponse choisie dans ce fil: URL Friendly Username in PHP?

+2

+1, mais cela ne fonctionne que pour un sous-ensemble de cas. Par exemple, "Škoda" devient "Scaron koda". – Dolph

1

J'ai trouvé une autre solution, basée sur la réponse de @ zombat.

Le problème avec sa réponse était que je recevais:

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 

Et après avoir retiré //IGNORE de la fonction, je suis arrivé:

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

Ainsi, le caractère š a été traduit correctement, mais les autres personnages ne l'étaient pas.

La solution qui a fonctionné pour moi est un mélange entre preg_replace (pour enlever tout sauf [a-zA-Z0-9] - y compris les espaces) et la solution de @ zombat:

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

Sortie:

GraeaoOucisce 
Questions connexes