ホームページ  >  記事  >  バックエンド開発  >  PHPエンコード変換機能で文字セットの自動変換と配列変換をサポート_PHPチュートリアル

PHPエンコード変換機能で文字セットの自動変換と配列変換をサポート_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:14:55946ブラウズ

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

//文字セットの自動変換は配列変換をサポートします
function auto_charset($fContents, $from='gbk', $to='utf-8') {
$from = strtoupper($from) == 'UTF-8' : $from;
$to = 'utf-8' : $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); (function_exists('iconv')) {
return iconv($from, $to, $fContents);
} else {
return $fContents;
} elseif (is_array($fContents)) {
foreach ($fContents) $key => $val) {
$_key = auto_charset($key, $from, $to)
$fContents[$_key] = auto_charset($val, $from, $to); key != $_key )
unset($fContents[$key]);
}
return $fContents;
}
else {
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($string) {
for($i=0; $i 127) { if( ($v >= 228) && ($v { if( ($i+2) >= (strlen($string) - 1)) return true; $v1 = ord ( $string[$i +1] );
$v2 = ord( $string[$i+2] );
if( ($v1 >= 128) && ($v1 return false;
else
}
}
return true;
return preg_match( '%^(?:
[x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80-xBF] # 長すぎない 2 バイト
| xE0[xA0-xBF][x80-xBF] # 長すぎるものを除く
| [xE1-xECxEExEF] [x80-xBF]{2} # ストレート 3 バイト
| xED[x80-xBF][x80-xBF] # サロゲートを除く
| } プレーン 1 ~ 3
| [xF1-xF3][x80-xBF]{3} プレーン 4 ~ 15
# プレーン 16
)*$% xs', $string) ;
}


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



http://www.bkjia.com/PHPjc/326216.html

www.bkjia.com

tru​​e
http://www.bkjia.com/PHPjc/326216.html

技術記事次のようにコードをコピーします。 // 自動変換文字セットは配列変換関数をサポートします auto_charset($fContents, $from='gbk', $to='utf-8') { $from = strtoupper($from) == 'UTF8 ' ? 'utf-8' :...

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