Php 使用iptcembed在JPG中写入IPTC数据时无UTf-8

Php 使用iptcembed在JPG中写入IPTC数据时无UTf-8,php,utf-8,iptc,Php,Utf 8,Iptc,我使用这个函数 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

我使用这个函数

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;
功能iptc制作标签($rec,$data,$value){
$length=strlen($value);
$retval=chr(0x1C).chr($rec).chr($data);
如果($length<0x8000)
{
$retval.=chr($length>>8).chr($length&0xFF);
}
其他的
{
$retval.=chr(0x80)。
chr(0x04)。
chr(($length>>24)和0xFF)。
chr(($length>>16)和0xFF)。
chr(($length>>8)和0xFF)。
chr($length&0xFF);
}
返回$retval.$value;
}

(来自)

在我的jpgs中写标题。 当我与Picasa/Picasaweb一起阅读JPG时,每个Umlaut和其他特殊字符都是错误的

此函数是否还未准备好用于unicode? 如何在jpgs中保存utf-8编码字符串

谢谢你的帮助,
Christian

问题的一部分是strlen()不支持多字节-它假定输入是单字节编码的。考虑使用,

而且,
chr()
仅为ASCII码


不过,我不是二进制专家,我对IPTC数据一无所知,所以我不确定这个函数还做了什么,还有哪些地方可能存在UTF-8问题。

我必须编写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字段,例如使用上的示例中所述的IPTC_make_标记功能,并最终将其嵌入JPEG:

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

希望这能为其他人节省我今天不得不进行的研究和调试…

语句“chr()仅限于ASCII”没有多大意义
chr
编码不可知,它只是一个介于0和0xFF之间的数字。我要说的是,对于0x7F以上的字节,它不支持enocoding。如果使用
chr()
进行字符比较,这可能会导致一些意外的结果,具体取决于源文件的编码。