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

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

WBOY
リリース: 2016-06-13 12:20:24
オリジナル
973 人が閲覧しました

Unicode と utf8 エンコードを再理解する

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(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

上の表には 2 つの意味があります。1 つは明らかに Unicode と UTF-8 の文字範囲の対応関係であり、もう 1 つは Unicode と UTF-8 がどのように相互に変換されるかを示しています。 >

まず UTF-8 から Unicode への変換について説明しましょう
UTF-8 でエンコードされたバイナリは、上記の 3 つの形式と照合されます。照合後、固定ビット (x 以外の位置) が削除されます。テーブル)、右から開始します。8 ビットが足りない場合、左側は 2 バイトと 16 ビットで構成されます。次の例を見てください:


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 から 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 は Unicode エンコードを使用し、バックエンド プログラムは UTF-8 を使用します。 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')8utf8_bytes('yrt燕睿涛')12</code>
ログイン後にコピー
バックエンド
<code>#对于GBK字符串$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);#对于UTF8字符串$len = ceil(strlen(bin2hex($word))/2);</code>
ログイン後にコピー
2015/5/21 8:21 :53 PM

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

4th Floor
清香白莲素黄真
Unicode は、各文字に対応する番号を定義する文字セットです。 。 , UTF-8、UTF-16などは、「文字に対応する数値」をバイナリでどのように格納するかを定義したエンコード形式です。
Re:
ランニングマン
@清香白连素は本当です、こう言った方が良いと思います:、Uincode 定義 文字各数値 (0x0000~0xFFFF) に対応する UTF-8 は、文字に対応する数値を定義します (すべての数値に対応する文字があるわけではありません)。その後、それらの間にマッピング関係が存在します
3階
最初の段落にタイプミスがあります
Re:
ランニングマン
@munen、変更されました、あまりにも不注意でした、ここで見直します、リマインドありがとうございます
2階
こまる
ブロガーが言及したUnicodeは実際にはutf-16です
1階
upfriend
普段はフロントエンドとバックエンドのコーディングを統一しているので、これまでこの問題にはあまり注目していませんでしたが、ブロガーの分析は非常に優れています、いいね!
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート