2013-06-05 4 views
0

De temps en temps j'obtiens des erreurs PHP des utilisateurs de mon site en téléchargeant des photos, et les données EXIF ​​ne sont pas valides UTF-8 lorsque j'essaie par la suite json_encode il. L'erreur spécifique que j'obtiens est:Essayer de comprendre exif.encode_unicode

E_WARNING: json_encode(): Invalid UTF-8 sequence in argument 

Ceci est généré par la dernière ligne du code ci-dessous.

ini_set('exif.encode_unicode', 'UTF-8'); 
$exif_data = exif_read_data($uploader_target_dir . $_POST['uploader_' . $i . '_tmpname']); 
$when_photo_taken = isset($exif_data['DateTime']) ? (int)strtotime($exif_data['DateTime']) : 0; 
$exif_data = (json_encode($exif_data)); 

Comme vous pouvez le voir, je régler l'option exif.encode_unicode-UTF-8, bien que je ne suis pas 100% sûr de ce que cela fait (la phrase « exif.encode_unicode définit les commentaires utilisateur characterset UNICODE sont traitées » dans le manuel semble assez ambigu/confus pour moi), mais de toute façon, il n'a pas résolu le problème.

Est-ce que quelqu'un sait exactement ce que cette option de configuration fait? Ou ce qui cause mon E_WARNING?

Répondre

1

Je suis raisonnablement sûr que cette configuration indique au code exif quel jeu de caractères pour convertir en lors de la conversion du texte qui est stocké dans l'image. Le problème sera qu'une partie du texte lu à partir des données exif sera soit prétendre être au format UTF-8, mais a en réalité quelques octets invalides, ou est d'une autre manière déformé. Si vous voulez étudier la cause du problème, ce qui peut valoir la peine d'être signalé comme un bug si cela affecte beaucoup d'images, vous pouvez obtenir les octets bruts du texte, et devriez être capable de voir ce qui cause exactement l'erreur en émettant les octets brutes:

foreach ($exif_data as $key => $value) { 

    $resultInHex = unpack('H*', $value); 
    $resultInHex = $resultInHex[1]; 
    $resultSeparated = implode(', ', str_split($resultInHex, 2)); //byte safe 

    var_dump($resultSeparated); 
} 

Si vous ne vous souciez pas et que vous voulez juste pour nettoyer vos données afin qu'il cesse de jeter des erreurs, vous pouvez simplement supprimer tous les caractères UTF8 non valides à partir de vos données utilisateurs - que vous devriez probablement être de toute façon.

function removeInvalidChars ($text) { 
    $regex = '/([\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3}) | ./x'; 
    return preg_replace($regex, '$1', $text); 
} 
+0

Nous vous remercions de votre excellente réponse. En utilisant les extraits ci-dessus, j'ai pu déterminer que les problèmes étaient dus à l'encodage JSON de la balise EXIF ​​'MakerNote' qui, sur la base d'une recherche plus approfondie, ne fonctionnerait pas dans la majorité des cas. . – Alex