OVH Cloud OVH Cloud

convertion de caracteres

8 réponses
Avatar
jerome herve
Pour rester indépendant des plates formes, j'ai besoin de convertir des
caractères codés iso-latin (ex \xe0 pour é) en caractères imprimables html.

J'ai fait un tour dans la doc et je suis revenu bredouile. j'ai tenté
avec htmlspecialchars, htmlentities sans succes.
Une idée?

8 réponses

Avatar
luc

Pour rester indépendant des plates formes, j'ai besoin de convertir des
caractères codés iso-latin (ex xe0 pour é) en caractères imprimables html.

J'ai fait un tour dans la doc et je suis revenu bredouile. j'ai tenté
avec htmlspecialchars, htmlentities sans succes.
Une idée?



A tu regarder du coté de

mb_convert_encoding ( )

http://fr3.php.net/mb_convert_encoding

tu convertie en ISO-8859-1, puis là tu peux appliquer tes fonction
htmeentities, ..ect

Avatar
Bruno Desthuilliers
jerome herve wrote:
Pour rester indépendant des plates formes, j'ai besoin de convertir des
caractères codés iso-latin (ex xe0 pour é) en caractères imprimables html.

J'ai fait un tour dans la doc et je suis revenu bredouile. j'ai tenté
avec htmlspecialchars, htmlentities sans succes.
Une idée?


Mettre la bonne déclaration de charset dans le <head></head> ?-)

Avatar
jerome herve
luc wrote:
A tu regarder du coté de

mb_convert_encoding ( )

http://fr3.php.net/mb_convert_encoding

tu convertie en ISO-8859-1, puis là tu peux appliquer tes fonction
htmeentities, ..ect


Oui, mais j'avais envie de m'en passer dans la mesure où je ne crains
que mbstring ne soit pas installé chez la majorité des hébergeurs
mutualisés.
Je pensais à quelque chose plus léger, mais je vais songer à cette solution.

Merci

Avatar
jerome herve
Bruno Desthuilliers wrote:
Mettre la bonne déclaration de charset dans le <head></head> ?-)


cela ne suffit pas car le navigateur ne sait pas convertir.
Et puis, je me sert de javascript qui lui reconnait bien les jeux de
caractères étendus.

Avatar
Olivier Miakinen

Pour rester indépendant des plates formes, j'ai besoin de convertir des
caractères codés iso-latin (ex xe0 pour é) en caractères imprimables html.

J'ai fait un tour dans la doc et je suis revenu bredouile. j'ai tenté
avec htmlspecialchars, htmlentities sans succes.
Une idée?


Selon l'interprétation que l'on peut faire de ta question, peut-être que
Luc ou Bruno y a déjà répondu, ou peut-être que c'est moi qui vais te
donner une réponse utilisable. Mais d'abord je commence par quelques
questions.

Dans ton exemple xe0, la chaîne que tu manipules contient-elle un octet
de valeur 224 (e0 en hexa) -- cas n°1 --, ou bien contient-elle quatre
caractères qui sont '', 'x', 'e' et '0' -- cas n°2 -- ?

Par ailleurs, est-ce que ton exemple est correct, ou bien t'es-tu trompé
en disant que xe0 doit devenir é ? En effet, en ISO-Latin-1 comme en
ISO-Latin-9, le caractère à la position 224 est le à ! Il ne s'agit pas
du codeset IBM 850 non plus, puisque c'est Ó qui est à cette position.


Je suppose que tu t'es trompé et que xe0 doit bien donner un à.

Dans le cas n°1, comme le signale Bruno tu n'as rien d'autre à faire que
de déclarer le bon charset. Si tu veux pouvoir utiliser un charset
différent, alors en supposant que $c contient l'octet de valeur xe0 tu
peux faire :
$result .= '&#' . ord($c) . ';'
Note que pour tout charset incluant ascii ceci n'est nécessaire que pour
les caractères tels que ord($c) >= 160.

Dans le cas n°2, tu peux transformer la chaîne 'e0' en le nombre 224
grâce à :
$valeur = hexdec('e0')
Ensuite, soit le charset est iso-latin-1 et il te suffit de faire :
$result .= chr($valeur);
Soit tu peux avoir un charset différent, et il faut :
$result .= '&#' . $valeur . ';'
Encore une fois, cette dernière forme n'est utile que lorsque tu as
$valeur >= 160.


En espérant avoir aidé,

--
Olivier Miakinen

Avatar
Olivier Miakinen
Le 02/07/2004 18:00, jerome herve répondait à luc :

mb_convert_encoding ( )

tu convertie en ISO-8859-1, puis là tu peux appliquer tes fonction
htmeentities, ..ect


Oui, mais j'avais envie de m'en passer dans la mesure où je ne crains
que mbstring ne soit pas installé chez la majorité des hébergeurs
mutualisés.
Je pensais à quelque chose plus léger, mais je vais songer à cette solution.


Ah, donc l'encodage de départ n'est pas ISO-8859-1. Si cet encodage est
monobyte, tu dois pouvoir faire facilement une fonction de traduction en
quelques lignes. Inspire toi de la fonction koi_to_win() proposée par
lanka le 7 février 2003 : <http://fr3.php.net/mb_convert_encoding>.


Avatar
jerome herve
Ah, donc l'encodage de départ n'est pas ISO-8859-1. Si cet encodage est
monobyte, tu dois pouvoir faire facilement une fonction de traduction en
quelques lignes. Inspire toi de la fonction koi_to_win() proposée par
lanka le 7 février 2003 : <http://fr3.php.net/mb_convert_encoding>.


Je n'avais pas vu cette remarque car j'utilise une doc non commentée.
Merci encore.

Avatar
jerome herve
Olivier Miakinen wrote:


Pour rester indépendant des plates formes, j'ai besoin de convertir des
caractères codés iso-latin (ex xe0 pour é) en caractères imprimables html.

J'ai fait un tour dans la doc et je suis revenu bredouile. j'ai tenté
avec htmlspecialchars, htmlentities sans succes.
Une idée?



Selon l'interprétation que l'on peut faire de ta question, peut-être que
Luc ou Bruno y a déjà répondu, ou peut-être que c'est moi qui vais te
donner une réponse utilisable. Mais d'abord je commence par quelques
questions.

Dans ton exemple xe0, la chaîne que tu manipules contient-elle un octet
de valeur 224 (e0 en hexa) -- cas n°1 --, ou bien contient-elle quatre
caractères qui sont '', 'x', 'e' et '0' -- cas n°2 -- ?

C'est bien un chaine de quatre caractères qui correspond à un caractère

accentué.

Par ailleurs, est-ce que ton exemple est correct, ou bien t'es-tu trompé
en disant que xe0 doit devenir é ? En effet, en ISO-Latin-1 comme en
ISO-Latin-9, le caractère à la position 224 est le à ! Il ne s'agit pas
du codeset IBM 850 non plus, puisque c'est Ó qui est à cette position.

oui, je me suis pris les pieds dans le tapis, il s'agit bien d'un 'à'



Je suppose que tu t'es trompé et que xe0 doit bien donner un à.

Dans le cas n°1, comme le signale Bruno tu n'as rien d'autre à faire que
de déclarer le bon charset.


Apparement non. J'ai fait des tests sur fedora core 2. L'encodage à
l'origine iso-8859-1 n'était pas correctement interprété quelque soit le
navigateur utilisé.
Sur ce système, les polices sont au standard utf8. php retourne
l'information dans le tableau $_ENV ($_ENV['LANG'] si je dis pas de bétises)

Si tu veux pouvoir utiliser un charset
différent, alors en supposant que $c contient l'octet de valeur xe0 tu
peux faire :
$result .= '&#' . ord($c) . ';'
Note que pour tout charset incluant ascii ceci n'est nécessaire que pour
les caractères tels que ord($c) >= 160.

Dans le cas n°2, tu peux transformer la chaîne 'e0' en le nombre 224
grâce à :
$valeur = hexdec('e0')
Ensuite, soit le charset est iso-latin-1 et il te suffit de faire :
$result .= chr($valeur);
Soit tu peux avoir un charset différent, et il faut :
$result .= '&#' . $valeur . ';'
Encore une fois, cette dernière forme n'est utile que lorsque tu as
$valeur >= 160.


En espérant avoir aidé,



Oui merci. Je vais pouvoir me débrouiller.