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 に答える