**更新 - 我发现这篇关于 Photoshop 编码的帖子- 说他们“将字符“©”编码为 UTF-8 编码的 Exif 元数据。”
** 答案 - 这是一个转义问题 - 不是编码问题。Photoshop 允许元数据中的版权符号而不对其进行转义。上面的链接中提到(并抱怨)了这一点。我更改了标题以反映真正的问题**
我已经阅读了该站点上的所有内容,试图将版权符号保存到 jpeg 元数据中。我知道问题出在编码上,并且已经尝试了所有方法。
问题:当我将版权符号保存到 jpeg 元数据时,它会像©
在 Photoshop 中一样显示,但是当我加载元数据时,它会正确显示。
写入 jpeg 时,我调用 UTF8_to_unicode_array() 对字符串进行编码,然后在保存之前调用 unicode_array_to_UTF8() 。知道我缺少什么吗?
从 UTF8 到 Unicode:
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 '';
}