试图理解exif.encode_unicode

时间:2013-06-05 10:10:38

标签: php utf-8 exif

有时候我的网站用户上传照片时会收到PHP错误,而当我随后尝试json_encode时,EXIF数据无效UTF-8。我得到的具体错误是:

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

这是由下面代码的最后一行生成的。

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));

正如您所看到的,我将exif.encode_unicode选项设置为UTF-8,尽管我不能100%确定这是什么(句子“exif.encode_unicode定义了字符集UNICODE用户注释处理“在手册中看起来很模糊/混淆我”,但无论哪种方式都没有解决问题。

有没有人确切知道此配置选项的作用?或者导致我E_WARNING的原因是什么?

1 个答案:

答案 0 :(得分:1)

我有理由确定该配置告诉exif代码在转换存储在图像中的文本时,将转换为的字符集。

问题是从exif数据中读取的一些文本要么声称是UTF-8格式,要么实际上有一些无效字节,或者是以其他方式出现乱码。

如果你想调查问题的原因,如果它影响很多图像可能值得作为bug报告,你可以从文本中获取原始字节,并且应该能够看到究竟是什么导致了发出原始字节的错误:

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

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

    var_dump($resultSeparated);
}

如果您不在乎并且只想清理数据以避免丢失错误,您可以从用户数据中删除所有无效的UTF8字符 - 无论如何都应该这样。

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);
}