Bis heute, um genau zu sein, wusste ich nicht, dass UTF-8-Kodierung und Unicode-Kodierung unterschiedlich sind, es gibt einen Unterschied囧
Es gibt einen gewissen Zusammenhang zwischen ihnen:
<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 |
Oben Die Tabelle hat offensichtlich zwei Bedeutungen. Die andere zeigt, wie Unicode in UTF-8 konvertiert wird:
UTF-8-codierte Binärdatei wird mit den oben genannten drei Formaten abgeglichen. Nach dem Abgleich werden die festen Bits (Nicht-x-Positionen in der Tabelle) entfernt und dann wird jede Gruppe von 8 Bits von rechts nach rechts verwendet Wenn nicht genügend 8 Bits vorhanden sind, verwenden Sie nicht die 2 Bytes und 16 Bits, die der UTF-8-Kodierung entsprechen
Im Bild oben ist das Textkodierungsformat UTF-8, und Sie können WinHex verwenden, um seine hexadezimale Darstellung zu sehen
<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>
21.05.2015 20:21:53Das Copyright dieses Artikels liegt für immer beim Autor ( (luluyrt@163.com) Jede Form des Nachdrucks ist ohne Zustimmung des Autors untersagt. Nach dem Nachdruck muss der Autor und der Originaltext-Link eindeutig angegeben werden, andernfalls behalten wir uns vor Recht auf rechtliche Haftung.Das Obige stellt das neue Verständnis der Unicode- und UTF8-Codierung vor, einschließlich Aspekten des Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.