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
#以下はChromeコマンドラインで実行した結果です
「ハン」
「u5B57」
「言葉」
#この時点で、UTF-8 から Unicode への変換はすでに非常に簡単な作業になっています。変換の疑似コードを見てください。
1バイト読んで、11100110
続きを読む 2 バイトで 11100101 10101101 10010111 を取得します
1011011 01010111
の形式に従って固定ビットを削除します。
16 桁が足りません。左側にゼロを追加してください 01011011 01010111 => 5B57
Unicode から UTF-8 への変換をもう一度見てください
コードは次のとおりです:
5B57
5B57 が位置する Unicode 範囲 0800
5B57 101101101010111 のバイナリ エンコーディングを取得します
前の手順でバイナリ エンコーディングを使用して、UTF-8 エンコーディングを右から左に 11100101 10101101 10010111 につなぎ合わせます
問題について話してください
今日の問題の原因について話しましょう。UTF-8 形式では多くの単語が入力されるため、フロントエンドとバックエンドでそれぞれ検証が行われます。 Unicode エンコードとバックエンド プログラムは UTF-8 エンコードを使用します。現在の解決策はこれです。
フロントエンドリーリー
舞台裏
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。