最近たまたまUnicodeエンコーディングを変換する必要があったので、PHPのライブラリ関数を確認しましたが、それを実現する関数は見つかりませんでした。 Unicode のエンコーディングとデコーディングを変換できます。まあ、それが見つからない場合は、自分で実装してください。 。 。
Unicode と Utf-8 エンコーディングの違い
Unicode は文字セットであり、UTF-8 は Unicode の 1 つであり、Unicode は固定長であり 2 バイトですが、UTF-8 は中国語文字の場合、UTF-8 の 1 バイトよりも多くのバイトを占有します。少ない。 Unicode は 2 バイトですが、UTF-8 の中国語文字は 3 バイトを占めます。
UTF-8 でエンコードされた文字の長さは理論的には最大 6 バイトですが、16 ビット BMP (Basic Multilingual Plane) 文字の長さは最大 3 バイトのみです。 UTF-8 エンコーディング テーブルを見てみましょう:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx の位置は、文字エンコーディング番号のバイナリ表現によって埋められます。右側にある x は、文字エンコーディング番号のマルチバイト文字列を表すためにあまり特別な意味を持ちません。 マルチバイト文字列では、最初のバイトの先頭にある「1」の数が文字列全体のバイト数になることに注意してください。最初の行は ASCII エンコードと互換性があるように 0 で始まり、1 バイト、2 行目は 2 バイト文字列、3 行目は中国語などの 3 バイトです。 (個人的な意見:実際には、単純に先頭の1の数をバイト数とみなして大丈夫です)
Unicode を Utf-8 に変換する方法
Unicode を UTF-8 に変換するには、もちろん違いが何であるかを知る必要があります。 Unicode のエンコーディングが UTF-8 にどのように変換されるかを見てみましょう。UTF-8 では、文字のバイトが 0x80 (128) 未満の場合、それは 1 バイトを占める ASCII 文字となり、変換は行われません。 UTF-8 は ASCII エンコードと互換性があるため、必要です。 Unicode の漢字「君」のエンコードが「u4F60」の場合、100111101100000 にバイナリ変換し、UTF-8 方式で変換します。 Unicode バイナリから 2 進数を下位から上位まで、一度に 6 ビットずつ取り出すことができます。たとえば、上記のバイナリを以下に示す形式に取り出すことができます。以前のバイナリは、形式に従って埋められます。 8 ビット以上は 0 で埋められます。
ユニコード: 100111101100000 4F60
utf-8: 11100100,10111101,10100000 E4BDA0
上記から、Unicode と UTF-8 の間の変換が直感的にわかります。もちろん、UTF-8 の形式を理解した後は、バイナリ内の対応する位置でそれを取り出すという逆の操作を実行できます。形式に従って変換され、結果として Unicode 文字が得られます (この操作は「置換」によって完了できます)。例えば、上記の「you」の変換では、その値が0x800より大きく0x10000未満であるため、3バイト格納と判断でき、最上位ビットを「12」だけ右にシフトする必要があります。ビットを取得し、3 バイト形式に従って、最高値を取得するには最上位ビットは 11100000 (0xE0 ) または (|) になります。同様に、2桁目を右に「6」ビットシフトし、最上位桁と2桁目の2進数値を左に置き、111111(0x3F)と位置(&)演算を行うことで計算できます。 )、11000000 (0x80) または (|) で合計されます。 3 番目のビットをシフトする必要はなく、最後の 6 ビットを直接取得し (& と 111111 (ox3F))、その後 11000000 (0x80) と OR (|) を演算します。
Utf-8 を Unicode に変換する方法
もちろん、UTF-8からUnicodeへの変換も、UTF-8形式の対応する位置にある2進数を抽出するシフト等によって行われます。上の例では、「you」は 3 バイトであるため、上位ビットから下位ビットまで各バイトを処理する必要があります。 UTF-8 では、「あなた」は 11100100,10111101,10100000 です。上位ビットから始めて、最初のバイト 11100100 から「0100」を取り出します。これは 11111 (0x1F) との AND (&) を取得するだけで、最上位の位置がわかります。毎回 6 桁が取得されるため、12 ビット目より前に置く必要があります。したがって、得られた結果は 12 ビット左にシフトする必要があり、最上位ビットは 0100,000000,000000 になります。 2 番目のビットは「111101」を取り出すため、2 番目のバイト 10111101 と 111111 (0x3F) を AND (&) するだけで済みます。結果を 6 ビット左にシフトし、最上位バイトまたは (|) の結果を取得すると、2 番目のビットが完成し、結果は 0100,111101,000000 になります。同様に、最後の桁は 111111 (0x3F) と直接 AND (&) 演算され、次に前の結果と OR (|) 演算されて、結果 0100,111101,100000 が得られます。
PHP コードの実装:
リーリーテストしてみました
$utf8_str = '我'; //这是汉字“你”的Unicode编码 $unicode_str = '4f6b'; //输出 6211 echo utf8_str_to_unicode($utf8_str) . "<br/>"; //输出汉字“你” echo unicode_str_to_utf8($unicode_str);
以上这些转换是针对中文汉字(非ASCII)的测试,并且只支持单个字符【一个完整的utf8字符或是一个完整的Unicode字符】互相转换,希望对大家的学习有所帮助。