2010-08-02 71 views
0

我用这个功能没有UTF-8时在JPG写IPTC数据与iptcembed

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阅读jpgs时,每个变音符号和其他特殊字符都是错误的。

是这个功能没有准备好Unicode的? 如何在jpgs中保存utf-8编码字符串?

感谢您的帮助, 基督教问题的

回答

0

部分原因是,strlen的()是不是多字节意识到 - 它假定输入为单字节编码。考虑使用mb_strlen()来代替。

此外,chr()是ASCII只。

我不是一个二进制大师,不过,我什么都不知道IPTC数据,所以我不能完全确定什么这个功能在做什么,还有什么地方有可能是UTF-8的问题。

+0

声明“CHR ()仅用于ASCII“没有多大意义。 'chr'是encoding-agnostic,它只是[“packs”](http://php.net/pack)一个介于0和0xFF之间的数字。 – Artefacto 2010-08-02 17:40:43

+0

我在说的是,它不是对0x7F以上的字节进行enocoding-aware。如果使用'chr()'进行字符比较,则可能会导致一些意外结果,具体取决于源文件的编码。 – 2010-08-02 19:01:23

+0

好的,thx很多家伙。 – christianhaller 2010-08-25 22:55:40

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; 

Aftewards你可以继续添加IPTC字段如与作为http://php.net/manual/en/function.iptcembed.php的例子说明,最后将它们嵌入到你的JPEG的iptc_make_tag功能:

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

希望这样可以节省别人的研究和调试我今天不得不做...