ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルで GB エンコーディングを UTF-8 エンコーディングに動的に変換するいくつかの方法の評価

PHP_PHP チュートリアルで GB エンコーディングを UTF-8 エンコーディングに動的に変換するいくつかの方法の評価

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

記事「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アドレスの評価→位置情報変換」の記事を参照してください):


2つの評価結果(小数点以下3桁までの精度、単位は秒): MySQLクエリ変換: 0.112
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;
// 評価が終了し、結果が出力されます




;


テキストクエリ変換: 10.590

MySQLクエリ変換: 0.099
テキストクエリ変換: 10.623





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

www.bkjia.com

本当

技術記事 「IP アドレス - 地理的位置変換の評価」では、ip2addr 関数を使用して IP データベース ファイルを直接読み取ることが、MySQL データベースを使用して IP データを保存するのと比較して、最も効率的であると述べられています。効率的...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。