ホームページ >バックエンド開発 >PHPチュートリアル >php 文字エンコーディング コードを検出_PHP チュートリアル
関数 utf8_gb2312($str, $default = 'gb2312')
{
$str = preg_replace("/[x01-x7f]+/", "", $str);
(空($str)) の場合は $default;
を返します
$preg = 配列(
"gb2312" => "/^([xa1-xf7][xa0-xfe])+$/", //gb2312かどうかを定期的に判定
"utf-8" => "/^[x{4e00}-x{9fa5}]+$/u", //通常の漢字かどうかの判定(utf8エンコードの条件)、実際にはこの範囲です繁体字中国語の文字が含まれています
);if ($default == 'gb2312') {
$option = 'utf-8';
} その他 {
$option = 'gb2312';
}if (!preg_match($preg[$default], $str)) {
return $option;
}
$str = @iconv($default, $option, $str);
// $option に変換できません。元のオプションが $default ではないことを示します
If (空($str)) {
return $option;
}
デフォルトのエンコーディングは gb2312 で、統計をとったところ、90% の確率で gb2312 であることがわかりました。したがって、私の検出関数は gb2312 であるようには見えず、結果は utf8 として検出されます。
1. すべての ASCII を削除します。すべてが ASCII の場合、それは gb2312 です。2. この文字列が gb2312 であると仮定し、正規表現を使用してそれが true gb2312 であるかどうかを確認し、そうでない場合は utf-8 です
3. 次に、iconv を使用して文字列を utf8 に変換します。変換が失敗した場合は、実際の gb2312 でエンコードされた文字ではない可能性があります
(通常のマッチングで可能な限り正確になるように努めましたが、gb2312 のエンコードは連続的ではないため、依然として穴が存在します)、最終的なエンコードは utf-8 です。
4. それ以外の場合は、gb2312 エンコードです
このようなチェック機能を追加した後は、1000 個のキーワードのうち文字化けしたコードは 1 つだけになり、以前の 100 個近くのキーワードに比べて大幅に減少しました。