정확히 말하면 오늘까지만 해도 UTF-8 인코딩과 유니코드 인코딩이 다르다는 사실을 몰랐는데 차이점이 있습니다囧
그들 사이에는 특정한 연관성이 있습니다. 차이점을 살펴보세요.
<code>UTF-8的长度是不一定的,有可能是1、2、3字节 Unicode长度一定,2个字节(USC-2) UTF-8可以和Unicode互相转换</code>
Unicode(16进制) | UTF-8(二进制) |
---|---|
0000 - 007F | 0xxxxxxx |
0080 - 07FF | 110xxxxx 10xxxxxx |
0800 - FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
위 표에는 두 가지 의미가 있습니다. 첫 번째는 분명히 유니코드와 UTF-8 문자 범위 간의 대응입니다. 다른 하나는 유니코드가 UTF-8로 변환되는 방법을 보여줍니다.
위 그림에서 텍스트 인코딩 형식은 UTF-8이며 WinHex를 사용하여 16진수 표현을 볼 수 있습니다
<code>字符 => UTF-8 => UTF-8二进制=> 去掉固定位置凑够16位的二进制 => 16进制 汉 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49 汉 => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57 #下面是在chrome命令行下面运行的结果 '\u6C49' "汉" '\u5B57' "字" #到这里的话,从UTF-8转换到Unicode已经是一件非常容易的事了,看看转换的伪代码 读取一个字节,11100110 判断该UTF-8字符的格式,属于第三种,3个字节 继续读取2个字节得到 11100101 10101101 10010111 按照格式去掉固定位 1011011 01010111 不够16位,左边补零 01011011 01010111 => 5B57</code>
<code>5B57 获取5B57所在的Unicode范围,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三个字节,形式为1110xxxx 10xxxxxx 10xxxxxx 获取5B57的二进制编码 101101101010111 用上一步骤的二进制编码从右至左拼接UTF-8编码 11100101 10101101 10010111 </code>
<code>function utf8_bytes(str) { var len = 0, unicode; for(var i = 0; i < str.length; i++) { unicode = str.charCodeAt(i); if(unicode < 0x0080) { ++len; } else if(unicode < 0x0800) { len += 2; } else if(unicode <= 0xFFFF) { len += 3; }else { throw "characters must be USC-2!!" } } return len; } #例子 utf8_bytes('asdasdas') 8 utf8_bytes('yrt燕睿涛') 12</code>
<code>#对于GBK字符串 $len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2); #对于UTF8字符串 $len = ceil(strlen(bin2hex($word))/2);</code>
5/21/2015 8:21:53 PM이 글의 저작권은 작성자에게 있습니다. iforever (luluyrt@ 163.com) 저자의 동의 없이는 어떠한 형태의 재인쇄도 금지됩니다. 기사를 재인쇄한 후에는 기사 페이지에 위치를 명시하고 원본 텍스트 링크를 명시해야 합니다. 법적 책임을 추구합니다.위 내용은 내용의 측면을 포함하여 유니코드와 utf8 인코딩에 대한 재이해를 소개하며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.