2013-06-05 54 views
0

偶尔我会从我的网站用户上传照片时得到PHP错误,而当我随后尝试json_encode它时,EXIF数据不是有效的UTF-8。我得到的具体错误是:试图理解exif.encode_unicode

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

我相当肯定,该配置告诉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); 
} 
+0

谢谢你的出色答案。使用上面的片段,我能够确定问题是由于尝试对“MakerNote”EXIF标记进行JSON编码而导致的,因为在大多数情况下,该进一步调查不适用,因为内容是专有的二进制格式。 – Alex