Question

Je suis en train de faire le remplacement de caractères accentués en PHP, mais obtenir des résultats géniaux, je pense être parce que je suis en utilisant une chaîne UTF-8 et str_replace peut ne pas gérer correctement les chaînes multi-octets ..

$accents_search     = array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'); 

$accents_replace    = array('a','a','a','a','a','a','a','A','A','A','A','A','e','e',
'e','e','E','E','E','E','i','i','i','i','I','I','I','I','oe','o','o','o','o','o','o',
'O','O','O','O','O','u','u','u','U','U','U','c','C','N','n'); 

$str = str_replace($accents_search, $accents_replace, $str);

Résultats je reçois:

Ørjan Nilsen -> �orjan Nilsen

Résultat attendu:

Ørjan Nilsen -> Orjan Nilsen

Edit: J'ai obtenu mon gestionnaire de caractères interne en UTF-8 (selon mb_internal_encoding ()), de ce que je peux aussi la valeur de $ str est UTF-8, donc dire, toutes les chaînes concernées sont UTF -8. Est-str_replace () détecter les ensembles char et les utiliser correctement?

Était-ce utile?

La solution

On dirait que la chaîne n'a pas été remplacé parce que votre codage d'entrée et le décalage d'encodage de fichiers.

Autres conseils

D'après la documentation php fonction str_replace est binaire en toute sécurité, ce qui signifie qu'il peut traiter du texte codé UTF-8 sans perte de données.

Il est possible de supprimer diacritiques en utilisant normalisation Unicode forme D (NFD) et le caractère Unicode propriétés.

DNF convertit quelque chose comme « ü » umlaut de « LETTRE MINUSCULE LATINE U TRÉMA » (qui est une lettre) à « LETTRE MINUSCULE LATINE U » (lettre) et « COMBINAISON TRÉMA » (pas une lettre).

header('Content-Type: text/plain; charset=utf-8');

$test = implode('', array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'));

$test = Normalizer::normalize($test, Normalizer::FORM_D);

// Remove everything that's not a "letter" or a space (e.g. diacritics)
// (see http://de2.php.net/manual/en/regexp.reference.unicode.php)
$pattern = '/[^\pL ]/u';

echo preg_replace($pattern, '', $test);

Sortie:

aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn

La classe normaliseur fait partie de la PECL paquet intl . (L'algorithme lui-même est pas très compliqué, mais a besoin de charger un grand nombre de correspondances de caractères afaik. J'ai écrit un implémentation PHP il y a un certain temps.)

(j'ajoute ces deux mois de retard parce que je pense que c'est une belle technique qui ne sait pas assez largement.)

Essayer cette définition de fonction:

if (!function_exists('mb_str_replace')) {
    function mb_str_replace($search, $replace, $subject) {
        if (is_array($subject)) {
            foreach ($subject as $key => $val) {
                $subject[$key] = mb_str_replace((string)$search, $replace, $subject[$key]);
            }
            return $subject;
        }
        $pattern = '/(?:'.implode('|', array_map(create_function('$match', 'return preg_quote($match[0], "/");'), (array)$search)).')/u';
        if (is_array($search)) {
            if (is_array($replace)) {
                $len = min(count($search), count($replace));
                $table = array_combine(array_slice($search, 0, $len), array_slice($replace, 0, $len));
                $f = create_function('$match', '$table = '.var_export($table, true).'; return array_key_exists($match[0], $table) ? $table[$match[0]] : $match[0];');
                $subject = preg_replace_callback($pattern, $f, $subject);
                return $subject;
            }
        }
        $subject = preg_replace($pattern, (string)$replace, $subject);
        return $subject;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top