Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Capturer les notices

11 réponses
Avatar
Etienne
Salut.

j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un

iconv() [<a href='function.iconv'>function.iconv</a>]:
Detected an illegal character in input string

j'aimerai pouvoir faire un sorte de try catch sur cette motification
mais j'y arrive pas...
comment puis-je faire ???

Merci
Etienne

10 réponses

1 2
Avatar
Olivier Miakinen
Bonjour,

Le 24/06/2010 19:59, Etienne a écrit :

j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un

iconv() [<a href='function.iconv'>function.iconv</a>]:
Detected an illegal character in input string

j'aimerai pouvoir faire un sorte de try catch sur cette motification
mais j'y arrive pas...
comment puis-je faire ???



Dans la doc je trouve ceci :

<http://fr2.php.net/manual/fr/language.exceptions.php>
Note: Les fonctions internes de PHP utilisent principalement l' Error
reporting, seules les extensions orientées objet utilisent les
exceptions. Quoiqu'il en soit, des erreurs peuvent facilement être
traduites en exceptions avec ErrorException.
</>

Puis, en cliquant sur le lien :

<http://fr2.php.net/manual/fr/class.errorexception.php>
Exemple #1 Utilisation de set_error_handler() pour changer tous les
messages d'erreurs en ErrorException
</>

Est-ce que ça répond à ton problème (je n'ai pas testé) ?

--
Olivier Miakinen
Avatar
Jean-Francois Ortolo
Le 24/06/2010 19:59, Etienne a écrit :
Salut.

j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un

iconv() [<a href='function.iconv'>function.iconv</a>]:
Detected an illegal character in input string

j'aimerai pouvoir faire un sorte de try catch sur cette motification
mais j'y arrive pas...
comment puis-je faire ???

Merci
Etienne




Bonsoir Monsieur

Le PHP Manual indique, que quand iconv() reçoit un caractère illégal,
la chaîne de sortie est tronquée, et une erreur E_NOTICE est générée, à
moins que le deuxième paramètre de la fonction iconv() , ne contienne le
token //TRANSLIT et/ou //IGNORE.

Dans le premier cas, le caractère illégal sera traduit par un
caractère approchant, et la traduction continuera. Dans le deuxième cas,
il ne sera pas remplacé, et la traduction des caractères continuera.

Bien à vous.

Amicalement.

Jean-François Ortolo
Avatar
WebShaker
Le 24/06/2010 21:28, Jean-Francois Ortolo a écrit :
Le PHP Manual indique, que quand iconv() reçoit un caractère illégal, la
chaîne de sortie est tronquée, et une erreur E_NOTICE est générée, à
moins que le deuxième paramètre de la fonction iconv() , ne contienne le
token //TRANSLIT et/ou //IGNORE.

Dans le premier cas, le caractère illégal sera traduit par un caractère
approchant, et la traduction continuera. Dans le deuxième cas, il ne
sera pas remplacé, et la traduction des caractères continuera.



Oui ben ca c'est ce qui est inscrit dans la doc.
mais en dans la pratique cela ne marche pas vraiment.

peut etre que cela fonctionne si on est sur de connaitre le charset
d'origine, mais dans mon cas (ou j'essaye d'encoder le contenu de mail
en utf-8 d'où qu'il vienne) cela ne marche pas.

dans certain cas iconv va donner un bon resultat dans d'autre il faut
mieux utilise mb_convert_encoding.

d'où mon idée de catcher les erreurs du premier pour tester avec le
second...

Etienne.
Avatar
Jean-Francois Ortolo
Le 25/06/2010 00:04, WebShaker a écrit :

dans certain cas iconv va donner un bon resultat dans d'autre il faut
mieux utilise mb_convert_encoding.

d'où mon idée de catcher les erreurs du premier pour tester avec le
second...

Etienne.





Bonjour Monsieur

Je ne comprend pas très bien.

Je n'ai pas vu la documentation de mb_convert_encoding.

Je ne sais pas si cette fonction permet de décoder vers utf8 venant
d'un encodage inconnu au départ.

Mais en tout cas, la fonction iconv(), avec erreur E_NOTICE, ne vous
donnera pas cet encodage source.

Donc... Pourquoi ne pas faire tout le traitement avec
mb_convert_encoding ? ;)

D'un autre côté, si vous avez le moyen de détecter l'encodage source
d'une manière ou d'une autre, vous pouvez très bien le détecter, puis
utiliser la fonction iconv() ?

Bien à vous.

Amicalement.

Jean-François Ortolo
Avatar
WebShaker
Le 25/06/2010 12:22, Jean-Francois Ortolo a écrit :
Je ne comprend pas très bien.
Je n'ai pas vu la documentation de mb_convert_encoding.



ben elle est là
http://www.php.net/manual/fr/function.mb-convert-encoding.php

Donc... Pourquoi ne pas faire tout le traitement avec
mb_convert_encoding ? ;)



Ben parce que dans certain cas je ne sais pas non plus pourquoi iconv va
mieux fonctionner.
Je sais c'est étrange.

par exemple iconv n'arrive pas a convertir un us-ASCII en UTF-8 alors
que mb_convert va y arriver.

dans d'autre cas ce sera l'inverse.

ensuite mb_convert va être capable dans certain cas d'encoder en se
débrouillant pour trouver tout seul le charset d'origine, ce qui est
très utile lorsque le mail est envoyé par un script à moitié fini qui
n'envoie pas le bon charset avec le message.

d'un autre coté des fois il va mb_convert va se gourrer lors de la
détection du charset alors que celui fournit dans le mail est le bon.

Alors peut être s'agit il d'un problème de configuration de mon serveur
(j'ignore si ces fonction font appel à des librairie linux). Mais bon je
suis obligé de composer avec ce que j'ai...

Et évidement pas question d'exclure les mails sous prétextes qu'il sont
mal encodé parce que que là ca va hurler.

Voila
Etienne
Avatar
Nicolas Damiens
Le 24/06/2010 19:59, Etienne a écrit :
Salut.

j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un

iconv() [<a href='function.iconv'>function.iconv</a>]:
Detected an illegal character in input string

j'aimerai pouvoir faire un sorte de try catch sur cette motification
mais j'y arrive pas...
comment puis-je faire ???



Ce n'est pas une exception, donc ne peut être attrapée par un try/catch.

Une erreur E_NOTICE est générée il faut donc regarder du côté de la
fonction error_reporting()

http://fr.php.net/manual/fr/function.error-reporting.php

Nicolas.
Avatar
Olivier Miakinen
Le 26/06/2010 10:14, WebShaker a écrit :

Donc... Pourquoi ne pas faire tout le traitement avec
mb_convert_encoding ? ;)



Ben parce que dans certain cas je ne sais pas non plus pourquoi iconv va
mieux fonctionner.
Je sais c'est étrange.



N'as tu pas la curiosité de savoir dans quels cas ça ne fonctionne pas ?
Moi cela m'intéresserait. Si tu trouves des chaînes qui se convertissent
bien avec mb_convert et pas avec iconv, ou le contraire, ce serait
intéressant que tu affiches ici le résultat de bin2hex(<chaîne source>).

Cf. http://fr.php.net/manual/fr/function.bin2hex.php

par exemple iconv n'arrive pas a convertir un us-ASCII en UTF-8 alors
que mb_convert va y arriver.



Es-tu sûr qu'il ne contient vraiment que de l'US-ASCII, c'est-à-dire des
caractères dont le code hexa est compris entre 20 et 7E, plus 09, 0A ou 0D ?

dans d'autre cas ce sera l'inverse.



Idem.

ensuite mb_convert va être capable dans certain cas d'encoder en se
débrouillant pour trouver tout seul le charset d'origine, ce qui est
très utile lorsque le mail est envoyé par un script à moitié fini qui
n'envoie pas le bon charset avec le message.



Ah oui, en effet c'est appréciable.


Cordialement,
--
Olivier Miakinen
Avatar
Etienne
Voila.

la chaine d'origine est:

LE CERCLE CRM - Petit-Déjeuner du 29 juin 2010

le bin2hex

4c4520434552434c452043524d202d2050657469742d44c3a96a65756e6572206475203239206a75696e2032303130

le resultat de iconv($useCharset, "UTF-8//TRANSLIT", $string);

LE CERCLE CRM - Petit-D

on voit donc que le //TRANSLIT deja ne sert a rien dans ce cas... il
traitement s'arrète net !

Peut être que que le charset d'origine n'est pas le bon (j'ai utilisé
celui envoyé dans le mail)
par contre

mb_convert_encoding($string, "UTF-8", 'auto');

converti correctement.

Etienne.
Avatar
Etienne
Le 26/06/2010 14:47, Olivier Miakinen a écrit :
N'as tu pas la curiosité de savoir dans quels cas ça ne fonctionne pas ?
Moi cela m'intéresserait. Si tu trouves des chaînes qui se convertissent
bien avec mb_convert et pas avec iconv, ou le contraire, ce serait
intéressant que tu affiches ici le résultat de bin2hex(<chaîne source>).



Ah ben si.
les cas je les ai.
je peux essayer d'en publier un si tu veux.

encore faut-il que je vérifie que le contenu du message n'est pas
critique ;)

je vais t'en trouver un.

Etienne
Avatar
Olivier Miakinen
Le 28/06/2010 10:13, Etienne a écrit :

la chaine d'origine est:

LE CERCLE CRM - Petit-Déjeuner du 29 juin 2010

le bin2hex

4c 45 20 43 45 52 43 4c 45 20 43 52 4d 20 2d 20


L E C E R C L E C R M -

Tout ceci est de l'ASCII 7 bits, lequel est compatible à la fois avec
tous les ISO-8859-X, avec les codages Windows CP1252 et MS-DOS CP850, et
aussi avec l'UTF-8.

50 65 74 69 74 2d 44 c3a9 6a 65 75 6e 65 72 20


P e t i t - d é j e u n e r

ASCII 7 bits partout, sauf pour le é = C3A9.

64 75 20 32 39 20 6a 75 69 6e 20 32 30 31 30


d u 2 9 j u i n 2 0 1 0

ASCII 7 bits partout.

Voyons donc comment se code un é dans divers codages :
<http://www.miakinen.net/vrac/charsets/?or=2&pr#3>
C'est 'E9' en ISO-8859-1, ISO-8859-15 et CP1252, '82' en CP850, '8E' en
MacRoman, et 'C3A9' en UTF-8.

En conclusion : ce texte est déjà de l'UTF-8.

le resultat de iconv($useCharset, "UTF-8//TRANSLIT", $string);

LE CERCLE CRM - Petit-D



Ah ? Il vaut quoi, $useCharset ?

Si c'est "UTF-8" tu devrais obtenir :
LE CERCLE CRM - Petit-Déjeuner du 29 juin 2010

Si c'est "ISO-8859-1" ou "ISO-8859-15" ou "CP1252", tu devrais avoir :
LE CERCLE CRM - Petit-Déjeuner du 29 juin 2010

Avec "CP850" ça devrait faire :
LE CERCLE CRM - Petit-D
1 2