ホームページ  >  記事  >  バックエンド開発  >  PHPを使用してUnicodeをUTF-8に変換する実装方法を共有します

PHPを使用してUnicodeをUTF-8に変換する実装方法を共有します

PHPz
PHPzオリジナル
2017-03-05 14:30:171684ブラウズ

以下のエディターは、PHP を使用して Unicode を UTF-8 に変換する実装方法 (推奨) を提供します。編集者はこれがとても良いと思ったので、参考として共有します。エディターをフォローして見てみましょう

例は次のとおりです:

function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|.{4};|\d+;|.+/U",$str,$r);
  $ar = $r[0];
  //print_r($ar);
  foreach($ar as $k=>$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) == "") {
       
      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));
    }
  }
  return join("",$ar);
}
echo unescape("紫星蓝");

本日、フォーム システムのユーザーが送信した中国語データが文字化けするというユーザー フィードバックがありました。テストの結果、iconv 変換に問題があることが判明しました。

iconv('UCS-2',
'GBK',
'中国語')
Google

検索で、Linuxサーバー上のUCS-2エンコード方式がWinodwsと矛盾していることが原因であることが分かりました。

それで、

iconv('UCS-2BE',

'GBK',
'中国語')に変更しました
試してみてください、中国語は普通です

以下は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. ファイルからの出力や printf からの出力などの Linux のエンコード出力には、コンソール上で適切なエンコードの一致が必要です (エンコードが一致しない場合、通常は、プログラムがコンパイルされた)、および制御ステーションの変換入力は、現在のシステム エンコーディングを確認する必要があります。 たとえば、コンソールの現在のエンコードが UTF-8 の場合、UTF-8 でエンコードされたものは正しく表示されますが、GBK は表示できません。同様に、現在のエンコードが GBK の場合、GBK エンコードは表示できますが、それ以降のシステムでは表示できません。より多くの変換をよりインテリジェントに処理する必要があります。ただし、パテなどのターミナルでは文字化けのトラブルを解消するためにターミナルのエンコード変換の設定が必要になります。

上記の記事の PHP を使用して Unicode を UTF-8 に変換する実装方法 (推奨) は、すべて編集者が共有した内容であり、参考になれば幸いです。また、php 中国語 Web サイトをサポートしていただければ幸いです。

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