ホームページ >バックエンド開発 >PHPチュートリアル >Unicode と utf8 エンコーディングを再理解する

Unicode と utf8 エンコーディングを再理解する

WBOY
WBOYオリジナル
2016-08-08 09:23:571132ブラウズ

Unicodeとutf8エンコーディングを再認識


今日まで、正確に言うと、UTF-8エンコーディングとUnicodeエンコーディングが異なること、違いがあることを知りませんでした
間には一定のつながりがありますはい、違いを見てください:

<code>UTF-8的长度是不一定的,有可能是1、2、3字节
Unicode长度一定,2个字节(USC-2)
UTF-8可以和Unicode互相转换</code>

Unicodeとutf8の関係


Unicode (16) UTF-8 (バイナリ)
00000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

1つ目は明らかにUTF-8文字範囲へのUnicode対応です。 Unicode と UTF がどのように機能するかを確認する別の方法8 は相互に変換できます:

まず UTF-8 から Unicode への変換について話しましょう

UTF-8 でエンコードされたバイナリは上記の 3 つの形式と照合され、照合後に固定ビットが削除されます (非 x 位置)表内)、8 ビットのグループごとに右から左に移動し、8 ビットが足りない場合、左側は 2 バイトと 16 ビットで構成され、対応する Unicode エンコーディングを表します。を UTF-8 に変換するには、次の例を見てください:
Unicode と utf8 エンコーディングを再理解する
上の図のテキスト エンコーディング形式は 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>
Unicode からの変換を見てみましょうto UTF-8
<code>5B57
获取5B57所在的Unicode范围,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三个字节,形式为1110xxxx 10xxxxxx 10xxxxxx
获取5B57的二进制编码 101101101010111
用上一步骤的二进制编码从右至左拼接UTF-8编码 11100101 10101101 10010111 </code>

問題について話しましょう


今日の問題の原因について話しましょう UTF-8 形式では各単語が最大 30 バイトなので、検証が行われます。 JavaScript はフロントエンドとバックエンドでそれぞれ行われます。バックエンド プログラムは UTF-8 エンコーディングを使用します。現在の解決策は次のとおりです

フロントエンド
<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>
バックエンド
5/21/2015 8:21:53 PM

この記事の著作権は作者iforever(luluyrt@163 .com)に帰属します。記事を転載した後、作者へのリンク、および作者の承諾なしに転載することを禁止します。原文は記事ページのわかりやすい位置に提供する必要があります。そうでない場合、当社は法的責任を追及する権利を留保します。

以上、Unicode と utf8 エンコーディングの再理解について、その側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。