2013-06-05 77 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