ホームページ  >  記事  >  php教程  >  PHPエンコード変換機能により文字セットの自動変換と配列変換をサポート

PHPエンコード変換機能により文字セットの自動変換と配列変換をサポート

WBOY
WBOYオリジナル
2016-06-13 11:56:441094ブラウズ

コードをコピー コードは次のとおりです:


// 文字セットの自動変換は配列変換をサポートします
function auto_charset ($fContents, $from='gbk', $to='utf-8') {
$from = strtoupper($from) == 'UTF8' : $from; $to = strtoupper ($to) == 'UTF8' ? : $to;
if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($ fContents) && !is_string($fContents))) {
//エンコーディングが同じか非文字列スカラーの場合は変換しません
return $fContents>}
if ( is_string($fContents)) {
if (function_exists('mb_convert_encoding')) {
return mb_convert_encoding($fContents, $to, $from)
} elseif (function_exists('iconv');
return iconv( $from, $to, $fContents);
} else {
return $fContents;
}
} elseif (is_array($fContents)) {
foreach ($fContents as $key => $val) {
$_key = auto_charset($key, $from, $to)
$fContents[$_key] = auto_charset($val, $from, $ to);
if ($key != $_key)
unset($fContents[$key]);
return $fContents;
>return $fContents;
}
}


不明なクライアントから送信されたデータを受け入れる場合、各クライアントのエンコーディングは均一ではないため、サーバーは 1 つのエンコーディング メソッドしか使用できません。この場合の処理​​には、受信した文字を特定のエンコーディングに変換するという問題が含まれます。
現時点では、iconv を直接使用してトランスコードすることを考えるかもしれませんが、iconv 関数が提供する必要がある 2 つのパラメータは入力エンコーディングと出力エンコーディングであることがわかっており、受け入れられる文字列がどのエンコーディングであるかはわかりません。 . この時に受信した文字のエンコードを取得できれば良いですね。
このような問題には、通常 2 つの解決策があります。


オプション 1

クライアントにデータを送信させる場合は、送信されたエンコーディングを指定します。この場合、エンコーディングを指定する追加の変数を指定する必要があります。
$string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str']; 🎜>この状況では、合意がない場合、またはクライアントを制御できない場合、このソリューションの使用はあまり適切ではないようです。
オプション 2

サーバー側は受信データのエンコーディングを直接検出します。
この解決策はもちろん最も理想的です。問題は、文字のエンコーディングをどのように検出するかということです。この状況に対して、PHP では、mb_string 拡張機能の mb_check_encoding が必要な機能を提供します。
$str = mb_check_encoding($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
ただし、これには mb_string 拡張機能を有効にする必要があります。場合によっては、この拡張機能が運用サーバーで有効になっていない場合があります。この場合、次の関数を使用してエンコーディングを決定する必要があります。 次の関数は私が書いたものではありません


コードをコピーします

コードは次のとおりです:

function isGb2312($文字列) { for($i=0; $i 127) { if( ($v >= 228) && ($v {

if( ($i 2) >= (strlen($string) - 1)) true を返します。

$v1 = ord( $string[$i 1] );
$v2 = ord( $string[$] i 2] );
if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 return false;
else
true を返す;
}
}
function isUtf8($string) {
return preg_match( '%^(? :
[x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80-xBF] # 過長でない 2 バイト
| xE0[xA0-xBF][x80- xBF] # オーバーロングを除く
| [xE1-xECxEExEF][x80-xBF]{2} # ストレート 3 バイト
| # サロゲートを除く
| [x90-xBF] [x80-xBF]{2} プレーン 1 ~ 3
| [xF1-xF3][x80-xBF]{3} プレーン 4 ~ 15
| [x80-xBF] {2} # plan 16
)*$%xs', $string);
}


ここでは、上記の関数のいずれかを使用してエンコードを実装できます。検出。そして指定されたエンコーディングに変換します。
$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

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