**更新-我发现了这个关于Photoshop编码的帖子 -说他们用UTF-8编码将字符“c”编码到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 '';
}
发布于 2013-09-08 11:28:38
您需要找出JPEG数据使用的编码方式。如果Photoshop不使用这种编码,它是错误的,你应该收回你的钱(并且使用一个免费的选择,这无论如何是更好的)。如果您的代码需要处理损坏的JPEG元数据(例如来自一个破碎的Photoshop),您将不得不猜测编码(可能是拉丁语-1或拉丁语-15),并相应地对其进行转码。
现在,假设您现在知道编码,您可以将字节转换为UTF-8 (这是Unicode编码),以便在PHP中使用。请注意,PHP不支持Unicode,它仍然使用字节字符串,因此ASCII范围以外的任何内容都将使用多个字符。在索引到这样一个字符串时,请记住这一点。这也提出了"unicode to UTF8“的含义,因为UTF-8是Unicode。
我知道我在这里有点乐观,但很难说问题出在哪里。在尝试诊断时,请确保始终知道正在处理的字符串的字节值。其原因是,显示总是涉及某种解释,这使得无法判断是否显示或内容是罪魁祸首。
我仍然猜测您的问题在哪里,或者至少在哪里您可以修复其中一个问题:您的函数uniord()将使用来自提供的字符串的可变字节数。如果单个字符(如版权符号)占用两个字节,您将解码该字符,然后在下一步中再次解码该字符的第二个字节,这只会产生垃圾。实际上,试图将一个连续字节(二进制中的10xxxxxx)解码为UTF-8序列中的第一个字节应该会引发一个异常,因为这是一个肯定的信号,表明您没有有效的UTF-8。做自己的好事,检查这样的错误,并大声示意他们!
https://stackoverflow.com/questions/18682877
复制相似问题