Heim  >  Artikel  >  Backend-Entwicklung  >  Unicode- und UTF8-Kodierung neu verstehen

Unicode- und UTF8-Kodierung neu verstehen

WBOY
WBOYOriginal
2016-08-08 09:23:571128Durchsuche

Unicode- und UTF8-Kodierung neu erkennen


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>

Die Beziehung zwischen Unicode und utf8


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:

Lassen Sie uns zuerst über Unicode sprechen Konvertierung

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
Unicode- und UTF8-Kodierung neu verstehenIm 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>
Schauen wir uns die Konvertierung von Unicode in UTF-8 an
<code>5B57
获取5B57所在的Unicode范围,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三个字节,形式为1110xxxx 10xxxxxx 10xxxxxx
获取5B57的二进制编码 101101101010111
用上一步骤的二进制编码从右至左拼接UTF-8编码 11100101 10101101 10010111 </code>
Problem


Lassen Sie uns über die Ursache des heutigen Problems sprechen. Viele Wörter werden im UTF-8-Format eingegeben und haben maximal 30 Bytes. Daher wird die Überprüfung im Front-End und im Backend separat durchgeführt. Es handelt sich um eine Unicode-Kodierung, und das Back-End-Programm verwendet die UTF-8-Kodierung. Die aktuelle Lösung lautet wie folgt:

Front-End
<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>
Backend
<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:53

Das 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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn