Changement de l’encodage des caractères

Bonjour,
Pour un projet un peu particulier (en gros, il s’agit de créer un fichier xml au format mods utilisé par l’Université de Strasbourg pour les archives ouvertes), on me demande de changer l’encodage des caractères. Par exemple, revenir à « pour $#171 ;.
J’utilise la méthode de remplacement desdites chaines de caractères en filtre du type

```
function change_encodage($texte){
        $expression[1]='(»)';
        $remplace[1]='»';
        $expression[2]='(«)';
        $remplace[2]='«';
        $nouveau_texte=preg_replace($expression,$remplace,$texte) ;
        return $nouveau_texte;
}
```

Pourtant, il ne se passe rien, alors que dans d’autres cas (par exemple le remplacement des balises), tout se passe à merveille.

Quelqu’un sait-il d’où ça peut venir ? le traitement des caractères se fait-il après celui des filtres ? Faut-il passer par le pipeline post-typo, ou autre ?
Merci de vos réponses.

Dans l’exposé de ce que tu veux… tu parles de $#171; puis dans la fonction tu testes « J’imagine c’est bien &

Son code est erroné, ça ne peut pas marcher : les regexp passées à preg_replace doivent être délimitées par un même caractère. Souvent on prend ‹ / › mais ça peut être ‹ , › ou autre chose du moment que ça ne figure pas dans la regexp elle même. Dans ton code ce délimiteur manque. Il faut l’ajouter au début et en fin de chaque pattern.
Mais en fait la fonction utilise preg_replace alors qu’elle n’a pas besoin de regexp. Ce serait mieux d’utiliser un simple str_replace, auquel cas il ne faut pas des regexp mais des simples chaines, et il ne faut alors pas ajouter les délimiteurs ‹ / › mais supprimer les parenthèses capturantes.

Par ailleurs les tableaux en PHP commencent à l’index 0. Là tu fais commencer le tableau à l’index 1. Je pense pas que ça gêne… mais je n’en suis pas certain… et ça ne facilite pas le débuging. Beaucoup plus simplement tu peux omettre l’index : il sera choisi automatiquement, sans risque d’erreur. Comme dans $remplace[]='»'; mais partout et toujours dans le bon ordre pour pas créer de décalage.

Mais surtout, PHP fournit des outils standards pour ce genre de besoin : par exemple la fonction html-entity-decode. Cette page de doc fournit aussi en commentaire une fonction plus complexe pour une plus grande variété de caractères : PHP: html_entity_decode - Manual

Merci JLuc pour ta réponse, très complète. Je ne suis pas un crack en, php, loin de là, donc tes avis sont des conseils précieux.