コードをコピー コードは次のとおりです:
// 文字セットの自動変換は配列変換をサポートします
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 つの解決策があります。
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'];