0

私はこの機能を使用します

function iptc_make_tag($rec, $data, $value){
    $length = strlen($value);
    $retval = chr(0x1C) . chr($rec) . chr($data);

   if($length < 0x8000)
   {
      $retval .= chr($length >> 8) .  chr($length & 0xFF);
   }
      else
   {
       $retval .= chr(0x80) . 
               chr(0x04) . 
               chr(($length >> 24) & 0xFF) . 
               chr(($length >> 16) & 0xFF) . 
               chr(($length >> 8) & 0xFF) . 
               chr($length & 0xFF);
   }

    return $retval . $value;

}

( http://php.net/manual/de/function.iptcembed.phpから)

私のjpgにキャプションを書く。Picasa/Picasaweb で jpg を読み取ると、すべてのウムラウトおよびその他の特殊文字が間違っています。

この関数はユニコードに対応していませんか? utf-8 エンコード文字列を jpg で保存するにはどうすればよいですか?

助けてくれてありがとう、クリスチャン

4

2 に答える 2

1

UTF-8 文字列を Photoshop で正しく表示するには、1:90 の IPTC フィールドを記述する必要がありました。$iptc という変数に IPTC データをアセンブルすると仮定すると、正しい UTF-8 処理を確実にするために、次の 3 行から開始する必要があります。

// These two lines ensure that UTF8-Encoding will work (set the 1:90 field in the envelop)
// @see http://cpanforum.com/threads/2114 for a hint
$utf8seq = chr(0x1b) . chr(0x25) . chr(0x47);
$length = strlen($utf8seq);
$iptc = chr(0x1C) . chr(1) . chr('090') . chr($length >> 8) . chr($length & 0xFF) . $utf8seq;

その後、http://php.net/manual/en/function.iptcembed.php の例で説明されているように、たとえば iptc_make_tag 関数を使用して IPTC フィールドを追加し続け最後にそれらを JPEG に埋め込むことができます。

// Embed the IPTC data
$content = iptcembed($iptc, $path);

これにより、今日私がしなければならなかった調査とデバッグを他の誰かが節約できることを願っています...

于 2010-12-16T11:17:18.227 に答える
0

問題の一部は、 strlen() がマルチバイトに対応していないことです。入力がシングルバイトでエンコードされていると想定しています。代わりにmb_strlen() の使用を検討してください。

また、chr()ASCIIのみです。

私はバイナリの達人ではありませんし、IPTC データについても何も知らないので、この関数が他に何をしているのか、他に UTF-8 の問題がどこにあるのか正確にはわかりません。

于 2010-08-02T14:10:43.940 に答える