記事「IP アドレス -> 地理的位置変換の評価」では、SQL クエリを使用して MySQL データベースを使用して IP データを保存するのと比較して、ip2addr 関数を使用して IP データベース ファイルを直接読み取ることが最も効率的であると述べられています。最も効率が悪いです。ただし、IP データベース ファイル QQWry.dat は GB2312 でエンコードされています。ここで、UTF-8 でエンコードされた地理位置情報の結果が必要になります。 MySQL メソッドを使用すると、データをデータベースに保存するときに、データを UTF-8 エンコーディングに完全に変換できます。ただし、QQWry.dat ファイルは変更できず、ip2addr 関数の出力結果は動的変換のみ可能です。
GB->UTF-8 エンコーディングを動的に変換するには、少なくとも 4 つの方法があります:
PHP の iconv 拡張機能を使用した変換
PHP の mb_string 拡張機能を使用した変換
MySQL データベースに保存されているスワップ テーブルを使用した変換
テキスト ファイルに保存されているスワップ テーブルを使用して変換します
最初の 2 つの方法は、サーバーが適切に設定されている (対応する拡張機能がコンパイルおよびインストールされている) 場合にのみ使用できます。私の仮想ホストにはこれら 2 つの拡張機能がないため、後者の 2 つの方法を検討する必要があります。最初の 2 つの方法は、この記事では評価されません。
評価手順は以下の通りです(func_ip.phpについては「IPアドレスの評価→位置情報変換」の記事を参照してください):
require_once ("func_ip.php"); function u2utf8($c) { $str = ""; if ($c < 0x80) { $str .= $c; } elseif ($c < 0x800) { $str .= chr(0xC0 | $c >> 6); $str .= chr(0x80 | $c & 0x3F); < 0x10000) { $str .= chr(0xE0 | $c >> 12); $str .= chr(0x80 | $c >> 6 & 0x3F); 0x80 | $c > } elseif ($c $str .= chr(0xF0 | $c >> 18); > 12 & 0x3F); $str .= chr(0x80 | $c >> $str .= chr(0x80 | $c & 0x3F); function GB2UTF8_SQL($strGB) { if (!trim($strGB)) return $strGB; $intLen = strlen($strGB); < $intLen; $i++) { if (ord($strGB{$i}) > 127) { $strCurr = substr($strGB, $i, 2); strCurr)) - 0x8080; $strSql = "nnstats_gb_unicode から code_unicode を選択します WHERE code_gb = ".$intGB." LIMIT 1" $resResult = mysql_query($strSql) if ($arrCode = mysql_fetch _ar)レイ($ resResult )) $strRet .= u2utf8($arrCode["code_unicode"]); else $strRet .= "??"; } else { $strRet .= $strGB{$i}; } return $strRet; } function GB2UTF8_FILE($strGB) { if (!trim($strGB)) return $strGB; foreach ($arrLines); $strLine) { $arrCodeTable[hexdec(substr($strLine, 0, 6))] = hexdec(substr($strLine, 7, 6)) } $strRet = ""; ( $strGB); for ($i = 0; $i < $intLen; $i++) { if (ord($strGB{$i}) > 127) { $strCurr = substr($strGB, $ i, 2); $intGB = hexdec(bin2hex($strCurr)) - 0x8080; if ($arrCodeTable[$intGB]) $strRet .= u2utf8($arrCodeTable[$intGB]); = "??"; $i++; else { $strRet .= $strGB{$i}; } function EncodeIp($strDotquadIp) { $arrIpSep; ( '.', $strDotquadIp); if (count($arrIpSep) != 4) 0 を返す; foreach ($arrIpSep as $k => $v) $intIp += (int ) $v * pow(256, 3 - $k); return $intIp //return sprintf('%02x%02x%02x%02x', $arrIpSep[0], $arrIpSep; [ 2], $arrIpSep[3]); } function GetMicroTime() { list($msec, $sec) =explode(" ", microtime()); return ((double)$msec + (double) ) $sec); } for ($i = 0; $i $strIp = mt_rand(0, 255).".".mt_rand(0) , 255).".".mt_rand(0, 255).".".mt_rand(0, 255); $arrAddr[$i] = ip2addr(EncodeIp($strIp)); ("localhost", "netnest", "netnest"); mysql_select_db("test"); // MySQL クエリのエンコード変換を評価します $dblTimeStart = GetMicroTime()for ($i = 0; $i < ; $i++) { $strUTF8Region = GB2UTF8_SQL($arrAddr[$i]["地域"]); $ dblTimeDuration = GetMicroTime() - $dblTimeStart;//評価が終了し結果が出力される echo $dblTimeDuration; echo "rn"; //評価テキストファイルのコーディング変換 $dblTimeStart = GetMicroTime(); 100; $ i++) { $strUTF8Region = GB2UTF8_FILE($arrAddr[$i]["地域"]); $strUTF8Address = GB2UTF8_FILE($arrAddr[$i]["アドレス"]); GetMicroTime() - $dblTimeStart; // 評価が終了し、結果が出力されます ; | 2つの評価結果(小数点以下3桁までの精度、単位は秒):
本当