0

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

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

4

1 回答 1

1

我有理由确定该配置会告诉 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);
}
于 2013-06-08T15:51:36.093 回答