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 时,每个 Umlaut 和其他特殊字符都是错误的。

这个函数还没有为 unicode 做好准备吗?如何在 jpg 中保存 utf-8 编码字符串?

谢谢你的帮助,克里斯蒂安

4

2 回答 2

1

我必须编写 1:90 IPTC 字段才能使我的 UTF-8 字符串在 Photoshop 中正确显示。假设您将 IPTC 数据组装在一个名为 $iptc 的变量中,您应该从以下三行开始,以确保正确的 UTF-8 处理:

// 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;

之后,您可以继续添加 IPTC 字段,例如使用http://php.net/manual/en/function.iptcembed.php上的示例中描述的 iptc_make_tag 函数,最后将它们嵌入到您的 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 回答