Php 试图理解exif.encode\u unicode

Php 试图理解exif.encode\u unicode,php,utf-8,exif,Php,Utf 8,Exif,偶尔我会从我的网站上传照片的用户那里得到PHP错误,当我随后尝试对其进行json\u编码时,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

偶尔我会从我的网站上传照片的用户那里得到PHP错误,当我随后尝试对其进行
json\u编码时,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\u unicode
选项设置为
UTF-8
,尽管我不能100%确定这是怎么回事(手册中的“exif.encode\u unicode定义字符集unicode用户注释被处理”这句话对我来说似乎很模糊/混乱),但无论如何都没有解决问题


有人确切知道此配置选项的功能吗?或者是什么导致了我的
E_警告

我可以合理地确定,在转换存储在图像中的文本时,该配置会告诉exif代码要转换到哪个字符集

问题是,从exif数据读取的一些文本要么声称是UTF-8格式,但实际上有一些无效字节,要么以其他方式被篡改

如果您想调查问题的原因(如果它影响大量图像,则可能值得报告为错误),您可以从文本中获取原始字节,并且应该能够通过发出原始字节来查看到底是什么导致了错误:

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

谢谢你出色的回答。通过使用上述代码片段,我能够确定问题是由于尝试对
MakerNote
EXIF标记进行JSON编码引起的,进一步研究发现,该标记在大多数情况下都不起作用,因为内容是专有的二进制格式。