Discussion:
Capturer les notices
(trop ancien pour répondre)
Etienne
2010-06-24 17:59:22 UTC
Permalink
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
Olivier Miakinen
2010-06-24 18:06:19 UTC
Permalink
Bonjour,
Post by Etienne
j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un
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
Jean-Francois Ortolo
2010-06-24 19:28:31 UTC
Permalink
Post by Etienne
Salut.
j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un
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
WebShaker
2010-06-24 22:04:03 UTC
Permalink
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.
Jean-Francois Ortolo
2010-06-25 10:22:43 UTC
Permalink
Ce message pourrait être inapproprié. Cliquez pour l'afficher.
WebShaker
2010-06-26 08:14:22 UTC
Permalink
Post by Jean-Francois Ortolo
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
Post by Jean-Francois Ortolo
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
Olivier Miakinen
2010-06-26 12:47:10 UTC
Permalink
Post by WebShaker
Post by Jean-Francois Ortolo
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
Post by WebShaker
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 ?
Post by WebShaker
dans d'autre cas ce sera l'inverse.
Idem.
Post by WebShaker
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
Etienne
2010-06-28 08:13:09 UTC
Permalink
Post by Olivier Miakinen
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
Etienne
2010-06-28 08:13:09 UTC
Permalink
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.
Olivier Miakinen
2010-06-28 09:49:34 UTC
Permalink
Post by Etienne
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.
Post by Etienne
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.
Post by Etienne
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=233>
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.
Post by Etienne
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�"�®jeuner du 29 juin 2010

Dans le cas de "MacRoman" :
LE CERCLE CRM - Petit-Déjeuner du 29 juin 2010

En fait, le seul charset que je connaisse devant à mon avis provoquer
une telle erreur est "ASCII"... à moins que ce ne soit un truc exotique
du genre de "Shift-JIS" ou "Big5" ?
Post by Etienne
on voit donc que le //TRANSLIT deja ne sert a rien dans ce cas... il
traitement s'arrète net !
Le //TRANSLIT et le //IGNORE servent à traiter un caractère existant
dans le charset source mais inexistant dans le charset de destination.
Autant dire qu'ils ne servent à rien si la destination est UTF-8 (et
qu'ils ne peuvent rien faire s'il y a une incohérence entre le texte
source et sa déclaration).
Post by Etienne
Peut être que que le charset d'origine n'est pas le bon (j'ai utilisé
celui envoyé dans le mail)
Justement, lequel était-ce ?
Post by Etienne
par contre
mb_convert_encoding($string, "UTF-8", 'auto');
convertit correctement.
Voui. UTF-8 est *très* facile à reconnaître, avec très peu de risques
d'erreur, et convertir de UTF-8 en UTF-8 ne doit pas être une tâche
insurmontable... ;-)

Cordialement,
--
Olivier Miakinen
Etienne
2010-06-28 10:25:01 UTC
Permalink
Post by Olivier Miakinen
Ah ? Il vaut quoi, $useCharset ?
Ben il est la le problème.
$useCharset vaut us-ascii (valeur provenant du mail)

Etienne

Nicolas Damiens
2010-06-26 08:18:56 UTC
Permalink
Post by Etienne
Salut.
j'utilise la fonction iconv pour convertir des chaine de caractères.
de temps en temps j'ai un
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.
Continuer la lecture sur narkive:
Loading...