-
- // 自動変換文字セットは配列変換をサポートします
- 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;
- }
- else {
- return $fContents;
- }
- }
コードをコピー
現時点では、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 < = 233) ) )
- {
- if( ($i+2) >= (strlen($string) - 1)) return true;
- $v1 = ord( $string[$i+1] );
- $v2 = ord ( $string[$i+2] );
- if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 < = 191) )
- return false;
- else
- return true;
- }
- }
- }
- return 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-byte
- | xED[x80-x9F][x80-xBF] # サロゲートを除く
- | xBF]{3} # プレーン 4-15
- | ここで、エンコーディングを検出して変換することができます指定されたエンコーディングに変換します。
$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
-
-
-
|