ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルで Unicode と utf8 エンコーディングについて簡単に説明します。
Unicodeとutf8エンコーディングを再理解します
今日まで、正確に言うと、たった今、UTF-8エンコーディングとUnicodeエンコーディングが異なる、違いがあることを知りませんでした
それらの間には特定のつながりがあります。違いを見てください:
UTF-8 の長さは定かではなく、1、2、または 3 バイトである可能性があります
Unicode には特定の長さ、2 バイト (USC-2) があります
UTF-8 は Unicode との間で変換できます
Unicodeとutf8の関係
ユニコード(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 ビットが足りない場合は、右から左へ 8 ビットごとにグループ化します。左側は取得されません。これらの 16 ビットは、UTF-8 に対応する Unicode エンコーディングを表します。
上の図のテキストエンコーディング形式はUTF-8であり、WinHexを使用してその16進表現を確認できます
コードは次のとおりです:
文字 => UTF-8 => UTF-8 バイナリ => 16 ビット バイナリ =>汉 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49
単語 => E5AD97 => 11100101 10101101 10010111 =>#以下はChromeコマンドラインで実行した結果です
「u6C49」
「u5B57」
「言葉」
#この時点で、UTF-8 から Unicode への変換はすでに非常に簡単な作業になっています。変換の疑似コードを見てください。
1バイト読んで、11100110
3 番目のタイプである 3 バイトに属する UTF-8 文字の形式を決定します
1011011 01010111
の形式に従って固定ビットを削除します。
16 桁が足りません。左側にゼロを追加してください 01011011 01010111 => 5B57
コードをコピーします。コードは次のとおりです:
5B575B57 が位置する Unicode 範囲 0800 5B57 101101101010111 のバイナリ エンコーディングを取得します
今日の問題の原因について話しましょう。UTF-8 形式では多くの単語が入力されるため、フロントエンドとバックエンドでそれぞれ検証が行われます。 Unicode エンコードとバックエンド プログラムは UTF-8 エンコードを使用します。現在の解決策はこれです
。フロントエンド
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
関数 utf8_bytes(str) |
{
var len = 0、ユニコード; for(var i = 0; i { unicode = str.charCodeAt(i); if(unicode
++レン; } else if(unicode
レン += 2; } else if(unicode
レン += 3; }その他{ 「キャラクターは USC-2 でなければなりません!!」をスローします } } レンを返します; } #例 utf8_bytes('asdasdas') 8 utf8_bytes('yrtyanruitao') 12
舞台裏
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。 |