PHP
PHP7

URLDECODE後の日本語の文字化けの対処について【PHP】

URLDECODE後の日本語の文字化けの対処について

 URLでエンコードされた機種依存文字を例にします。
 「%E2%93%88」と「%E2%93%85」についてです。
 単純にデコードを行い、文字コード変換を行うと、
 前者が〇S(Sが〇枠に入った文字)、後者が〇P(Pが〇枠に入った文字)となります。
 まず、環境ですが、以下のようになります。
 ①php.ini・・・default_charset = "SJIS"
 ②xxx.php・・・charset="SJIS"
 の状態とします。この環境下で、どの文字コードで文字化けしない結果が得られるか
 検証です。
 事前に、「mb_detect_encoding($wk1, "ASCII,EUC-JP,UTF-8")」で
 文字コードを調べておきます。この文字コードは、UTF-8となりました。
 urldecode関数を使用し、UTF-8から文字コード変換を行い、上記の機種依存文字が正常に表示されるか検証です。

xxx.php
$wk1 = "%E2%93%88";
echo urldecode($wk1,'SJIS','UTF-8');   // ①の結果
echo urldecode($wk1,'CP932','UTF-8');  // ②の結果
echo urldecode($wk1,'EUC-JP','UTF-8'); // ③の結果

①、②とも「?」と出力されました。③は、残念ながら文字化けで変な漢字?が出力されました。
①、②ともSJIS関連ですが扱える漢字が②の方が多く文字化けにも対応されていますが、
ある機種依存文字は、まだ対応していないなど課題はあります。
そうしたら、これでは限界?と思っている方もいらっしゃると思いますが
実は、以下の方法で文字化けを解消することができます。

xxx.php
$wk1 = "%E2%93%88";
echo urldecode($wk1,'HTML-ENTITIES','UTF-8');   // ④の結果

これは、HTML エンティティを適切な文字に変換するというもの。
④の結果は、「Ⓢ」という機種依存文字となります。正常に表示されていますか。
上記のような、URLがエンコードされたものには、適用可能ですが、&で書かれた数値付の記号(&#xCODE)みたいなのは、これとは別の方法で変換をかけないとうまくいかないので注意が必要です。