Gestion de caractères en UTF-8

WRInaute accro
Je dispose d'un script de création de flux RSS en ISO latin. Il gère assez mal les encodages UTF-8, ce qui se traduit par des problèmes de caractères accentués. J'ai donc développé une routine de détection du charset, ce qui me permet de faire un url_decode quand il faut. Le problèmes des caractères accentués est alors réglé. Le problème restant concerne les apostrophe ' arrondies, qui apparaissent sous la forme d'un "?". Quelqu'un voit-il comment régler ce dernier problème ?
 
WRInaute occasionnel
Je ne comprends pas bien le système, est ce toi qui génère le RSS ou veux tu simplement afficher un RSS iso-latin sur ton site en utf-8?
 
WRInaute accro
MarvinLeRouge a dit:
Changer automatiquement toutes les apostrophes par de simples quotes ?

C'est à cela que j'ai pensé au départ, avec un strtr, mais ça ne marche pas.

mowmow a dit:
http://fr.php.net/utf8-decode ?
sietjp a dit:
Je ne comprends pas bien le système, est ce toi qui génère le RSS ou veux tu simplement afficher un RSS iso-latin sur ton site en utf-8?

Je fais le tout, en fait.
J'affiche du RSS sur un site ISO Latin. Mais je dispose aussi d'un système qui analyse un site de news (qui peut être en UTF8) sans RSS et qui crée le RSS (en ISO Latin). C'est là que j'ai un problème. Je détecte bien le charset du site, je fais un UTF8-decode, les caractères accentués passent bien mais pas les apostrophes.
 
WRInaute accro
MarvinLeRouge a dit:
Changer automatiquement toutes les apostrophes par de simples quotes ?

En fait, j'ai oublié de dire, il y a truc crade qui marche. Vu qu'il me met des ? à la place des ' arrondis (et, dans mon cas, apparemment, à la place de rien d'autre), je peux remplacer les ? par des ' :oops: .
Vous en conviendrez, c'est vraiment très très crade (vive les phrases interrogatives :lol: ), donc je cherche autre chose...
 
WRInaute impliqué
ecocentric a dit:
shrom a dit:
Une solution serait de passer par les entités HTML.

Sans doute mais je n'ai pas le contrôle de la source. La source peut être codée avec les pieds, avec des encodages divers.

Tu veux dire que dans un flux RSS, tu peux avoir un mélange ISO-8859-1 et UTF-8. Ces gens là ne méritent même pas qu'on utilise leur flux.

Sinon, c'est pas compliqué, si rien n'est indiqué, le flux DOIT être en UTF-8, sinon c'est l'encodage spécifié.

Je me sers de flux de type RSS sur la plupart de mes sites, quand un site ne respecte pas la norme, le flux passe à la poubelle et c'est tout. Il y a assez de flux divers et variés pour ne pas à avoir à s'embeter avec ceux qui ne veulent pas faire l'effort de faire un flux RSS correct.
 
WRInaute accro
shrom a dit:
ecocentric a dit:
shrom a dit:
Une solution serait de passer par les entités HTML.

Sans doute mais je n'ai pas le contrôle de la source. La source peut être codée avec les pieds, avec des encodages divers.

Tu veux dire que dans un flux RSS, tu peux avoir un mélange ISO-8859-1 et UTF-8. Ces gens là ne méritent même pas qu'on utilise leur flux.

Sinon, c'est pas compliqué, si rien n'est indiqué, le flux DOIT être en UTF-8, sinon c'est l'encodage spécifié.

Je me sers de flux de type RSS sur la plupart de mes sites, quand un site ne respecte pas la norme, le flux passe à la poubelle et c'est tout. Il y a assez de flux divers et variés pour ne pas à avoir à s'embeter avec ceux qui ne veulent pas faire l'effort de faire un flux RSS correct.

Ce que je veux dire, c'est que les flux RSS sont souvent mal formés. Ca, je sais gérer relativement bien (j'ai 2 lecteurs RSS qui se partagent la tâche, le second sachant rattraper certaines erreurs du premier...). Vu que je gère un annuaire - lecteur RSS, il faut bien que je me débrouille. L'outil de syndication que je suis en train de terminer permet justement de sortir des flux "nettoyés" sur base d'entrées potentiellement mal codées.

Ce que je gère moins bien, c'est l'encodage. Notamment, la conversion d'UTF8 vers ISO Latin pose problème. Le problème vient de l'apostrophe arrondie, que la fonction utf8-decode change en un ?. Je pense que le problème vient du fait que ce caractère n'a pas d'équivalent en ISO, donc la fonction ne sait pas le convertir. Mais je ne suis pas sûr et me demande comment gérer ce problème proprement.
 
WRInaute accro
Bon, en fait, c'est le caractère unicode 8217 qui pose problème. Il tient sur 3 octets et n'est pas représentable tel quel en ISO Latin. Donc, utf8_decode le remplace par un ? puisqu'il n'y a pas d'équivalent en ISO latin.

Pour s'en sortir, je n'ai rien trouvé de mieux pour le moment qu'analyser la chaîne avant conversion par utf8_decode, de manière à identifier les blocs de 3 caractères correspondant au caractère Unicode 8217.

L'idéal pour la suite serait peut-être de baculer tout le site en UTF8 et de pouvoir travailler en d'ISO vers UTF et d'UTF vers UTF plutôt que ISO vers ISO et UTF vers ISO (ce qui pose parfois problème) :?: .
 
WRInaute occasionnel
Pour info, j'ai réussi à me sortir du même problème ainsi :
Code:
$title = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $item['title']);
 
WRInaute discret
ecocentric a dit:
sgaze a dit:
Pour info, j'ai réussi à me sortir du même problème ainsi :
Code:
$title = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $item['title']);

Ah, ok, merci pour l'info, je vais regarder ça !

Bonjour,

Y a-t-il une solution quand la fonction Iconv n'est pas disponible ?

@+
 
WRInaute accro
Oui, il faut utiliser la fonction PHP htmlentities() dans la page qui affiche le resultat du flux. A mettre uniquement autour des données à afficher, pas le code source des balises !
 
WRInaute discret
TOMHTML a dit:
Oui, il faut utiliser la fonction PHP htmlentities() dans la page qui affiche le resultat du flux. A mettre uniquement autour des données à afficher, pas le code source des balises !

Excellent !

Merci beaucoup, c'est quand même mieux avec des accents. Nos confrères anglo-saxons ont plus de chance ;)

@+
 
WRInaute discret
Autant je peux comprendre l'intérêt de convertir de l'ISO-8859-1 vers de l'UTF8, autant l'inverse n'a pour moi aucun sens. Tu devrais bosser directement en UTF8, là tu te compliques la vie pour rien.
 
WRInaute accro
ça peut très bien être plus compliqué de transformer tout le site en UTF-8 que de rajouter une seule fois cette fonction ;-)
 
WRInaute discret
Code:
find . -type f | grep  "\.htm" | awk '{print "recode ISO8859-1..UTF-8 \""$1"\""}' | sh
find . -type f | grep  "\.php" | awk '{print "recode ISO8859-1..UTF-8 \""$1"\""}' | sh
find . -type f | grep  "\.css"  | awk '{print "recode ISO8859-1..UTF-8 \""$1"\""}' | sh
find . -type f | grep  "\.js"  | awk '{print "recode ISO8859-1..UTF-8 \""$1"\""}' | sh

Je précise que le code ci-dessus n'est pas de moi, je savais que ça se faisait avec recode (librairie iconv) et j'ai fait une recherche google qui m'a donné le script tout fait.

Ensuite il y a la base de données si tu rentres dans un cas de site très dynamique, un tuto ici:
http://blog.neovov.com/index.php?2007/0 ... e-en-utf-8
 
Discussions similaires
Haut