0

**更新 - Photoshop のエンコーディングに関するこの投稿を見つけました- 「文字 "©" を UTF-8 エンコーディングで Exif メタデータにエンコードする」と書かれています。

** 回答 - エンコーディングの問題ではなく、エスケープの問題でした。Photoshop では、メタデータで著作権記号をエスケープせずに使用できます。これは、上記のリンクで言及されています(そして不満を述べています)。実際の問題を反映するようにタイトルを変更しました**

著作権記号を jpeg メタデータに保存しようとしているこのサイトのすべてを読みました。問題がエンコードであることはわかっており、すべてを試しました。

問題: 著作権記号を jpeg メタデータに保存すると©、Photoshop のように表示されますが、メタデータを読み込むと正しく表示されます。

jpeg に書き込むときは、文字列をエンコードするために UTF8_to_unicode_array() を呼び出してから、保存する前に unicode_array_to_UTF8() を呼び出しています。私が見逃しているものはありますか?

UTF8 からユニコードへ:

function UTF8_to_unicode_array($utf8_text )
{    
    // Create an array to receive the unicode character numbers output
    $output = array();
    mb_convert_encoding($utf8_text,'utf-8');                
    $atext = mbStringToArray($utf8_text);

// Cycle through the characters in the UTF-8 string
foreach ($atext as $text ){
    $output [] = uniord2($text);
}
return $output;
}

function uniord2($c)

  $ord0 = ord($c{0}); if ($ord0>=0   && $ord0<=127) return $ord0;
  $ord1 = ord($c{1}); if ($ord0>=192 && $ord0<=223) return ($ord0-192)*64 + ($ord1-128); 
  $ord2 = ord($c{2}); if ($ord0>=224 && $ord0<=239) return ($ord0-224)*4096 + ($ord1-128)*64 + ($ord2-128);
  $ord3 = ord($c{3}); if ($ord0>=240 && $ord0<=247) return ($ord0-240)*262144 + ($ord1-128)*4096 + ($ord2-128)*64 + ($ord3-128);
return false;
}


function mbStringToArray ($string) {
  $array = array();
  $strlen = mb_strlen($string);
  while ($strlen) {
    $array[] = mb_substr($string,0,1,"UTF-8");
    $string = mb_substr($string,1,$strlen,"UTF-8");
    $strlen = mb_strlen($string);
}
return $array;
}

Unicode から UTF8 へ:

function unicode_array_to_UTF8( $unicode_array ){
    // Create a string to receive the UTF-8 output
    $output = "";

    // Cycle through each Unicode character number
    foreach( $unicode_array as $unicode_char )
    {
  $output .= utf8($unicode_char);
}

    // Return resulting UTF-8 String
    return $output;
}

function utf8($num){
  if($num<=0x7F)       return chr($num);        
  if($num<=0x7FF)      return chr(($num>>6)+192).chr(($num&63)+128);
  if($num<=0xFFFF)     return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
  if($num<=0x1FFFFF)   return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128).chr(($num&63)+128);
return '';
}
4

1 に答える 1