Нет UTf-8 при записи данных IPTC в JPG с iptcembed - PullRequest
0 голосов
/ 02 августа 2010

Я использую эту функцию

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)

писать подписи в моих jpgs. Каждый Умлаут и другие специальные символы неправильны, когда я читаю jpgs с помощью Picasa / Picasaweb.

Эта функция не готова для Unicode? Как я могу сохранить строки кодирования utf-8 в jpgs?

Спасибо за вашу помощь, Christian

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Мне пришлось написать поле IPTC 1:90, чтобы строки 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_tag, как описано в примере на http://php.net/manual/en/function.iptcembed.php, и, наконец, встраивание их в ваш JPEG:

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

Надеюсь, это спасет кого-то еще от исследований и отладки, которые я должен был сделать сегодня ...

0 голосов
/ 02 августа 2010

Отчасти проблема в том, что strlen () не поддерживает многобайтовый режим - предполагается, что входное значение закодировано однобайтово.Попробуйте вместо этого использовать mb_strlen () .

Кроме того, chr() только для ASCII.

Хотя я не бинарный гуру и ничего не знаю оДанные IPTC, поэтому я не совсем уверен, что еще делает эта функция и где еще могут быть проблемы с UTF-8.

...