ホームページ >バックエンド開発 >PHPチュートリアル >PHP は Unicode と Utf-8 間の変換を実装します
1. エンコーディングの原理と実装
Unicode エンコーディングは、utf-8 と gb シリーズのエンコーディング (gb2312、gbk、gb18030) 間の変換の基礎ですが、utf-8 からこれらへの比較表を直接作成することもできます。エンコーディング ですが、utf-8 の変数エンコーディングが不確実であるため、これを行う人はほとんどいません。そのため、実際には Unicode と gb エンコーディングの比較表 (utf-2) が使用されます。 8 は単なる実装であり、この 2 つは次のような対応関係になります。
u0000 0800 - u0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx現在 utf-8 で使用されている文字はすべて UCS-2 であるため、逆に UTF-8 に変換する場合は、4 ~ 6 バイトのエンコーディングを考慮する必要はありません。 4 バイトを超える UTF-8 文字が表示された場合は、文字化けとして直接無視するか、Unicode エンティティ形式 ("long int;" 形式) に変換して、ブラウザまたは関連する解析プログラムに引き渡して処理することができます。 、PHP を使用して Unicode を utf-8 エンコーディングに変換するアルゴリズムは次のとおりです。
function uni2utf8( $c ) { if ( $c < 0x80) { $ utf8char = chr ( $c ); } else if ( $c < 0x800) { $utf8char = chr (0xC0 | $c >> chr (0x80 | $c &) 0x3F ); } else if ( $c { } $utf8char = chr (0xE0 | t;> 0x06 & 0x3F )。フ); } //UCS-2 には 2 バイトしかないため、次の状況は不可能です。ここでは、Unicode HTML エンティティ エンコーディングの使用法について説明します。 else { $utf8char = "{$c}; } return $utf8char;" 現在の環境では考えられますutf-8 文字セット == unicode (UCS-2) ですが、理論的には、主要な文字セット間の包含関係は次のとおりです。 > gb18030 > gbk > gb2312
gbk => 18030 => ユニコード(UCS-2) => ; utf-8
| このような変換プロセスは基本的にロスレスですが、逆に、
utf-8 => unicode(UCS-2) => gbk => gb2312 |
$str = rawurldecode( $ str ) ; preg_match_all( "/(?:%u.{4})|.{4};|d+;|.+/U" , $str , $r ); $ r [0]; // Print_r ($ ar); Foreach ($ ar as $ k = & gt; $ v) { IF (SUBSTR ($ v, 0,2) == "" " %u" ){ $ar [ $k ] = iconv( "UCS-2BE" , "UTF-8" ,pack( "H4" , substr ( $v ,-4))); elseif ( substr ( $v ,0,3) == "" ){$ar [ $k ] = iconv( "UCS-2BE" , "UTF-8" ,pack( "H4" , substr ( $v ,3,-1))); } elseif ( substr ( $v, 0,2) == "" ) { 2BE" , "UTF-8" ,pack( "n" 、部分文字列 ( $v ,2,-1)))); Linux サーバーの CS-2 エンコード方式は Winodws のエンコード方式と一致しません。これに関する暗黙のルールは次のとおりです。 2 つのプラットフォームでの UCS-2 エンコーディング: 1。UCS-2 は UTF-16 と等しくありません。 UTF-16 は ASCII 文字範囲を使用して各バイトをエンコードしますが、UCS-2 は ASCII 文字範囲を超えて各バイトをエンコードできます。 UCS-2 と UTF-16 は 1 文字あたり最大 2 バイトを占有しますが、エンコーディングが異なります。 2. UCS-2 の場合、Windows のデフォルトは UCS-2LE です。 MultibyteTowidechar (または A2W) を使用すると、UCS-2LE Unicode が生成されます。 Windows のメモ帳では、テキストを UCS-2BE として保存できます。これは、変換の追加レイヤーに相当します。 3. UCS-2 の場合、Linux でのデフォルトは UCS-2BE です。 iconv (UCS-2 を指定) を使用して、UCS-2BE Unicode を変換および生成します。 Windows プラットフォームから UCS-2 に変換する場合は、UCS-2LE を指定する必要があります。 4. Windows や Linux などの複数のプラットフォームでは UCS-2 (UCS-2LE、UCS-2BE) についての理解が異なるという事実を考慮して。 MS は、Unicode に次の文字が Unicode であることを示し、ビッグ エンディアンまたはリトル エンディアンを識別するブート フラグ (UCS-2LE FFFE、UCS-2BE FEFF) があることを推奨しています。 したがって、Windows プラットフォームからのデータにこのプレフィックスが含まれていることが判明した場合でも、パニックに陥る必要はありません。 5. Linux のエンコード出力 (ファイルからの出力や printf からの出力など) は、コンソール上で適切なエンコードの一致を必要とします (エンコードが一致しない場合は、通常、プログラムのコンパイル時のエンコードに関係があります)。 )、およびコンソール変換 表示する必要があるシステム コードを入力します。たとえば、コンソールの現在のエンコードが UTF-8 の場合、UTF-8 でエンコードされたものは正しく表示できますが、GBK は表示できません。同様に、現在のエンコードが GBK の場合、GBK エンコードは表示できるはずです。よりインテリジェントに変換されます。ただし、パテなどのターミナルでは文字化けのトラブルを解消するためにターミナルのエンコード変換の設定が必要になります。
| 3. 参考として、PHP での中国語文字の完全な UNICODE エンコードとデコードの実装のペアを提供します。