Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/12/2010, 12h34   #1
Membre à l'essai
 
Inscription : mai 2007
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 146
Points : 23
Points : 23
Par défaut Equivalent strtr pour plusieurs octets

Bonjour,

j'utilise la fonction suivante:

Code :
$message = strtr($message,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛܯàâãäåçèéêëìíîï©£òóôõöùúûü~ÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaceeeeiiiioooooouuuuyyy');
mais je me retrouve avec des résultats de ce genre:
C'est pendant l'y�ty� que les y�toiles brillent. Et my�me dy�s le dy�but de la soiry�e!

Ce qui signifie, qu'en plus d'un problème d'encodage, j'ai un souci avec les des lettres "mal remplacées".

En regardant la doc de PHP je me rends compte que strtr est fait pour remplacer "chaque caractère (de un octet)".

Est ce que le souci ne vient pas de là? Que je veux remplacer des caractères codés sur + d'un octet?

Merci d'avance

D
divad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 13h33   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
strtr, comme beaucoup d'autres fonctions, travaille individuellement sur les octets donc forcément, dans un jeu où les caractères sont/peuvent être codés sur plusieurs octets (comme UTF-8), ça va foirer.

Pour vraiment utiliser strtr, dans ces circonstances, il faut utiliser sa forme "tableau associatif" (équivalente à str_replace) :
Code :
1
2
3
4
5
6
7
8
$out = strtr(
    $in,
    array(
        'è' => 'e',
        'à' => 'a',
        // ...
    )
);
Mais il existe d'autres solutions comme un machin de ce genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function utf8_transliterate($in) {
    if (ICONV_IMPL == 'glibc') {
        $out = iconv('UTF-8', 'ASCII//TRANSLIT', $in); # Résultat dépendant de l'implémentation (libiconv - BSD, Windows, etc - vs glibc - Linux)
    } else {
        $patterns = array(
            '~&([A-za-z])(?:grave|acute|circ|tilde|uml|ring|cedil|slash|caron);~' => '\1',
            '~&([A-za-z]{2})lig;~' => '\1',
            '~&[^;]+;~' => '',
        );
 
        $out = htmlentities($in, ENT_NOQUOTES, 'UTF-8');
        $out = preg_replace(
            array_keys($patterns),
            array_values($patterns),
            $out
        );
    }
 
    return $out;
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 14h08   #3
Membre à l'essai
 
Inscription : mai 2007
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 146
Points : 23
Points : 23
Ah ben ça marche mieux :p

Je prends la première solution qui est la plus simple à comprendre pour moi

Pour les encodages, j'ai l'impression que je n'y comprendrai jamais rien...

Merci encore!

D
divad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h36.


 
 
 
 
Partenaires

Hébergement Web