exif problème d'encodage

14 réponses
Avatar
Une Bévue
Bonjour,

je lis (via php) les infos exif d'une image prise par un téléphone
Samsung SM-N7505.

quand je lis ça au terminal j'ai une ligne "Comment" avec un caractère
mal encodé (???) :
Comment : File written by Adobe Photoshop� 5.0
-----------------------------------------------------------------^-----

du coup je ne peux pas lire, avec php, les autres données.

mais je pourrais demander à exiftool de transcoder, quelqu'un a une idée
du codaage utilisé pour produire cette erreur ?

une autre info des métadonnéess :
ExifByteOrder : Little-endian (Intel, II)


au cas où bous auriez quelque lumière.

le fichier en question est une photo prise par un téléphone et envoyée
par email, je ne vois pas ce que fais photoshop là-dedans (c'est moi qui
me suis envoyé la photo) ?

10 réponses

1 2
Avatar
SAM
Le 14/12/16 à 08:18, Une Bévue a écrit :
Bonjour,
je lis (via php) les infos exif d'une image prise par un téléphone
Samsung SM-N7505.
Comment : File written by Adobe Photoshop� 5.0
le fichier en question est une photo prise par un téléphone et envoyée
par email, je ne vois pas ce que fais photoshop là-dedans (c'est moi qui
me suis envoyé la photo) ?

samsung, c'est-y pas Chinois ?
Y z'auront "oublié" de supprimer le copyright de leur copie de code de
manip d'images ?
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
Une Bévue
Le 14/12/2016 à 18:28, SAM a écrit :
samsung, c'est-y pas Chinois ?
Y z'auront "oublié" de supprimer le copyright de leur copie de code de
manip d'images ?

je ne sais pas chinois ou coréen ?
c'est casse pied quand-même de perdre du temps pour un ®, ...
Avatar
Olivier Miakinen
Le 14/12/2016 08:18, Une Bévue a écrit :
quand je lis ça au terminal j'ai une ligne "Comment" avec un caractère
mal encodé (???) :
Comment : File written by Adobe Photoshop� 5.0
-----------------------------------------------------------------^-----
du coup je ne peux pas lire, avec php, les autres données.
mais je pourrais demander à exiftool de transcoder, quelqu'un a une idée
du codage utilisé pour produire cette erreur ?

Le plus probable, c'est qu'il envoie de l'ISO-8859-1 alors que ton
terminal est en UTF-8.
--
Olivier Miakinen
Avatar
Une Bévue
Le 14/12/2016 à 19:18, Olivier Miakinen a écrit :
Le plus probable, c'est qu'il envoie de l'ISO-8859-1 alors que ton
terminal est en UTF-8.

oui, c'est ce que je pense aussi. au terminal pas de pb, je vois un "?"
dans un carré au lieu de ® mais avec php ça bloque complétement je fais un :
exec ("/usr/local/bin/exiftool $options $path", $infos, $exitstatus);
quand j'ai ce pb, $infos ET $exitstatus restent désespéremment vides...
bon, c'est dans le champs de commentaire, donc, pour l'instant je ne le
lis plus...
Avatar
Olivier Miakinen
Le 15/12/2016 06:34, Une Bévue m'a répondu :
Le plus probable, c'est qu'il envoie de l'ISO-8859-1 alors que ton
terminal est en UTF-8.

oui, c'est ce que je pense aussi. au terminal pas de pb, je vois un "?"
dans un carré au lieu de ® mais avec php ça bloque complétement je fais un :
exec ("/usr/local/bin/exiftool $options $path", $infos, $exitstatus);
quand j'ai ce pb, $infos ET $exitstatus restent désespéremment vides...

Tu veux dire qu'en retour $exitstatus n'est même pas un entier ?!?
As-tu essayé :
- de positionner une valeur de LANG lors de l'appel ?
exec("LANG=(un truc compatible avec ton OS) exiftool ...", ...);
- de faire un pipe avec iconv ?
exec("exiftool ... | iconv ...", ...);
- plus simplement de positionner le paramètre charset que je lis dans
la doc ?
https://linux.die.net/man/1/exiftool
exec("exiftool -charset UTF-8 ... ", ...);
--
Olivier Miakinen
Avatar
Une Bévue
Le 15/12/2016 à 12:06, Olivier Miakinen a écrit :
Tu veux dire qu'en retour $exitstatus n'est même pas un entier ?!?

Oui, oui, strictement rien en retour même pas un exitstatus à 1...
ça "hang"...
As-tu essayé :
- de positionner une valeur de LANG lors de l'appel ?
exec("LANG=(un truc compatible avec ton OS) exiftool ...", ...);

non, je préfère la dernière solution avec l'argument -charset=Latin1
- de faire un pipe avec iconv ?
exec("exiftool ... | iconv ...", ...);

ça non, mais bon, il m'est difficile de faire ça seulement pour les
photos du samsung et surtout pour un commentaire inutile (dans ce cas).
- plus simplement de positionner le paramètre charset que je lis dans
la doc ?
https://linux.die.net/man/1/exiftool

oui, j'ai essayé, pas probant.
peut-être devrais-je essayer avec Latin1 ??
sur le group php US quelqu'un a répondu que les normes jpeg datent d'un
temps où l'encodage était :
Not-so-much faulty as software that doesn't understand character set
encodings. JPEG comments are a 32,767 octet block of whatever randomness
you want to put in there. There is no way to indicate what encoding or
set of characters are represented. Adobe is probably just using
something stupid like ISO-8859-1 or (worse) the Microsoft "equivilents"
like Windows-1250 or Windows-1252.
Avatar
Olivier Miakinen
Le 15/12/2016 19:01, Une Bévue a écrit :
- plus simplement de positionner le paramètre charset que je lis dans
la doc ?
https://linux.die.net/man/1/exiftool

oui, j'ai essayé, pas probant.
peut-être devrais-je essayer avec Latin1 ??

Tu devrais surtout savoir quel charset est utilisé
- par ton terminal de commandes
- dans tes scripts PHP
- dans le fichier lui-même
Ensuite, tu as pas mal de lecture ici :
http://www.sno.phy.queensu.ca/~phil/exiftool/faq.html#Q10
En particulier, on y voit comment définir d'une part le charset
externe (qui doit être égal à celui du terminal quand tu lances
la commande depuis le terminal, mais égal à celui de ton script
PHP quand tu la lances depuis PHP), d'autre part le charset
interne pour différents types de métadonnées (exif, iptc, id3,
photoshop ou quicktime).
Bon courage !
P.-S. : je ne peux pas t'aider pour déterminer le charset de ton
terminal ou celui de tes scripts PHP, mais si tu mets le fichier
sur cjoint je peux peut-être essayer de trouver le charset interne.
--
Olivier Miakinen
Avatar
Une Bévue
Le 15/12/2016 à 21:37, Olivier Miakinen a écrit :
Tu devrais surtout savoir quel charset est utilisé
- par ton terminal de commandes

ben UTF-8
- dans tes scripts PHP

UTF-8
- dans le fichier lui-même

là c'est un mystère, d'après le lien que tu donnes ci-dessous, il est
spécifié que :
Certain meta information formats allow coded character sets other than
plain ASCII. When reading, most known encodings are converted to the
external character set according to the exiftool "-charset CHARSET" or
-L option, or to UTF‑8 by default.
donc, les entrées sorties d'exiftool se font en UTF-8 par défaut, ce qui
me va très bien.
Ensuite, tu as pas mal de lecture ici :
http://www.sno.phy.queensu.ca/~phil/exiftool/faq.html#Q10
En particulier, on y voit comment définir d'une part le charset
externe (qui doit être égal à celui du terminal quand tu lances
la commande depuis le terminal, mais égal à celui de ton script
PHP quand tu la lances depuis PHP), d'autre part le charset
interne pour différents types de métadonnées (exif, iptc, id3,
photoshop ou quicktime).

j'ai essayé plusieurs encodages, rien n'y fait
Bon courage !
P.-S. : je ne peux pas t'aider pour déterminer le charset de ton
terminal ou celui de tes scripts PHP, mais si tu mets le fichier
sur cjoint je peux peut-être essayer de trouver le charset interne.

ça c'et très facile, il n'y a rien de vraiment confidentiel, une banale
photo prise dans le tgv.
je vais en mettre 2, car j'ai fait une manip :
j'ai dupliqué la photo originale :
$ cp 20161202_085945.jpg 20161202_085945_TEST.jpg
pour 20161202_085945_TEST.jpg j'ai changé au terminal le champs
"Comment" (le seul posant problème) par :
$ exiftool -Comment='File written by Adobe Photoshop® 5.0'
/Users/yt/Downloads/20161202_085945_TEST.jpg
donc j'ai écris "®" à la place du "�", ensuite j'ai relu ce fichier au
terminal :
$ exiftool /Users/yt/Downloads/20161202_085945_TEST.jpg
ExifTool Version Number : 10.20
File Name : 20161202_085945_TEST.jpg
Directory : /Users/yt/Downloads
[...]
Comment : File written by Adobe Photoshop® 5.0
[...]
Field Of View : 60.3 deg
Focal Length : 3.7 mm (35 mm equivalent: 31.0 mm)
Hyperfocal Distance : 1.47 m
.-[:~]-[16-12-16 08:40:54]
'->$
tu peux voir que là, le caractère "®" m'est bien restitué...
le fichier de test (donc bon) :
<http://www.cjoint.com/doc/16_12/FLqh3QQgoTX_20161202-085945-TEST.jpg>
le fichier original avec le "�" :
<http://www.cjoint.com/c/FLqh6XNTJZX>
<http://www.cjoint.com/doc/16_12/FLqh6XNTJZX_20161202-085945.jpg>
mais bon ne perd pas trop de temps là-dessus...
Avatar
Olivier Miakinen
Le 16/12/2016 09:00, Une Bévue a écrit :
Le 15/12/2016 à 21:37, Olivier Miakinen a écrit :
Tu devrais surtout savoir quel charset est utilisé
- par ton terminal de commandes

ben UTF-8
- dans tes scripts PHP

UTF-8

Ok, parfait.
- dans le fichier lui-même

[...]
le fichier de test (donc bon) :
<http://www.cjoint.com/doc/16_12/FLqh3QQgoTX_20161202-085945-TEST.jpg>

C'est codé C2 AE, soit le ® en UTF-8.
le fichier original avec le "�" :
<http://www.cjoint.com/c/FLqh6XNTJZX>
<http://www.cjoint.com/doc/16_12/FLqh6XNTJZX_20161202-085945.jpg>

C'est codé A8, soit le ® en MacRoman.
Cf. <http://www.miakinen.net/vrac/charsets/?hv=h&o6=MacRoman&or=6&pr8>.
Essaye :
-charset exif=MacRoman
-charset iptc=MacRoman
-charset id3=MacRoman
-charset photoshop=MacRoman
-charset quicktime=MacRoman
--
Olivier Miakinen
Avatar
Une Bévue
Le 16/12/2016 à 11:04, Olivier Miakinen a écrit :
le fichier de test (donc bon) :
<http://www.cjoint.com/doc/16_12/FLqh3QQgoTX_20161202-085945-TEST.jpg>

C'est codé C2 AE, soit le ® en UTF-8.

rien de + "normal"
le fichier original avec le "�" :
<http://www.cjoint.com/c/FLqh6XNTJZX>
<http://www.cjoint.com/doc/16_12/FLqh6XNTJZX_20161202-085945.jpg>

C'est codé A8, soit le ® en MacRoman.

bon, d'accord.
Cf. <http://www.miakinen.net/vrac/charsets/?hv=h&o6=MacRoman&or=6&pr8>.
Essaye :
-charset exif=MacRoman
-charset iptc=MacRoman
-charset id3=MacRoman
-charset photoshop=MacRoman
-charset quicktime=MacRoman

toujours :
Comment : File written by Adobe Photoshop� 5.0
1 2