ホームページ >バックエンド開発 >PHPの問題 >PHPでUnicodeとutf8を変換する方法

PHPでUnicodeとutf8を変換する方法

coldplay.xixi
coldplay.xixiオリジナル
2020-07-17 09:49:313059ブラウズ

php で Unicode を utf8 に変換する方法: 1. utf8 に変換します。文字のバイト数が 128 未満の場合は、変換する必要はありません。その後、下位桁から上位桁まで 2 進数を取得します。 ;2. utf8 を Unicode に変換するには、最初の上位バイトから 0100 を抽出し、それを順番に左にシフトします。

PHPでUnicodeとutf8を変換する方法

php で Unicode と utf8 を変換する方法:

Unicode と Utf-8 エンコーディングの違い

Unicode は文字セットであり、UTF-8 は Unicode の 1 つです。Unicode は固定長で 2 バイトですが、UTF-8 は可変です。中国語の場合、Unicode の占有量は 1 バイト少ないとします。 UTF-8よりも。 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 の数を単純にバイト数と見なすことができます)

関連学習の推奨事項:初心者から熟練度までの PHP プログラミング

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 桁ずつ取り出すことができます。たとえば、上記の 2 進数を次の形式に取り出すことができます。以前のものは形式に従って埋められ、任意の8 ビット未満は 0 で埋められます。

unicode: 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桁目のバイナリ値を残し、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 (&) を取るだけです。3 バイトから、毎回 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字符转换成Unicode字符
 * @param  [type] $utf8_str Utf-8字符
 * @return [type]           Unicode字符
 */
function utf8_str_to_unicode($utf8_str) {
    $unicode = 0;
    $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
    $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
    $unicode |= (ord($utf8_str[2]) & 0x3F);
    return dechex($unicode);
}
/**
 * Unicode字符转换成utf8字符
 * @param  [type] $unicode_str Unicode字符
 * @return [type]              Utf-8字符
 */
function unicode_to_utf8($unicode_str) {
    $utf8_str = &#39;&#39;;
    $code = intval(hexdec($unicode_str));
    //这里注意转换出来的code一定得是整形,这样才会正确的按位操作
    $ord_1 = decbin(0xe0 | ($code >> 12));
    $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f));
    $ord_3 = decbin(0x80 | ($code & 0x3f));
    $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));
    return $utf8_str;
}

テストしました

$utf8_str = &#39;我&#39;;
//这是汉字“你”的Unicode编码
$unicode_str = &#39;4f6b&#39;;
//输出 6211
echo utf8_str_to_unicode($utf8_str) . "<br/>";
//输出汉字“你”
echo unicode_str_to_utf8($unicode_str);

上記の変換は、中国語の文字 (通常は非 ASCII) のテスト用です。同じことの繰り返しなので、それほど労力を費やす必要はありません。

以上がPHPでUnicodeとutf8を変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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