エンコーディング識別のためにphpのmb_detect_encoding関数を使用する場合、GB2312とUTF-8、またはUTF-8とGBK(ここでは主にcp936の場合)など、エンコーディングが正しくない問題に多くの人が遭遇したと言われています)ネット上では文字が短いためmb_detect_encodingが誤判定してしまうとのこと。
例:
$encode = mb_detect_encoding($keytitle, array("ASCII",'UTF-8′,"GB2312′,"GBK",'BIG5′)); if ($encode == “UTF-8″){ $keytitle = iconv("UTF-8″,"GBK",$keytitle); }
このコードの目的は、文字列のエンコードが UTF-8 であるかどうかを検出し、UTF-8 である場合は GBK に変換することです。
ただし、$keytitle = “%D0%BE%C6%AC” の場合は、検出結果は UTF-8 です。このバグは実際にはバグではありません。プログラムを作成する際には、文字列が短い場合、検出結果が偏る可能性があります。
それを解決するにはどうすればよいでしょうか?
$encode = mb_detect_encoding($keytitle, array('ASCII','GB2312′,'GBK','UTF-8');
3 つのパラメーターは、検出される入力変数、エンコード方式の検出順序 (一度 true になると、後で自動的に無視されます)、および厳密モード
です。
最大の可能性が最初に配置されるようにエンコード検出の順序を調整すると、誤った変換の可能性が減ります。
通常、gb2312 を最初にソートする必要があります。GBK と UTF-8 がある場合は、よく使用されるものを最初にソートする必要があります。