Home >Backend Development >PHP Tutorial >Evaluation of several methods of dynamically converting GB encoding to UTF-8 encoding in PHP_PHP Tutorial
In the article "Evaluation of IP Address->Geolocation Conversion", it is mentioned that using the ip2addr function to directly read the IP database file is the most efficient. Compared with using the MySQL database to store IP data, using SQL query is the least efficient. . But the IP database file QQWry.dat is GB2312 encoded. Now I need UTF-8 encoded geolocation results. If you use the MySQL method, you can convert the data to UTF-8 encoding when it is stored in the database, once and for all. However, the QQWry.dat file cannot be modified, and the output result of the ip2addr function can only be dynamically converted.
There are at least four ways to dynamically convert GB->UTF-8 encoding:
Convert using PHP's iconv extension
Convert using PHP's mb_string extension
Convert using a swap table, the swap table is stored in the MySQL database
Convert using a swap table, the swap table is stored in a text file
The first two methods require the server to do it Corresponding settings (compilation and installation of corresponding extensions) can be used. My virtual host does not have these two extensions, so I have to consider the latter two methods. The first two methods are not evaluated in this article.
The evaluation procedure is as follows (func_ip.php, please refer to the article "Evaluation of IP Address->Geolocation Conversion"):
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); } elseif ($c < 0x10000) { $str .= chr(0xE0 | $c >> 12); $str .= chr(0x80 | $c >> 6 & 0x3F); $str .= chr(0x80 | $c & 0x3F); } elseif ($c < 0x200000) { $str .= chr(0xF0 | $c >> 18); $str .= chr(0x80 | $c >> 12 & 0x3F); $str .= chr(0x80 | $c >> 6 & 0x3F); $str .= chr(0x80 | $c & 0x3F); } return $str; } function GB2UTF8_SQL($strGB) { if (!trim($strGB)) return $strGB; $strRet = ""; $intLen = strlen($strGB); for ($ i = 0; $i < $intLen; $i++) { if (ord($strGB{$i}) > 127) { $strCurr = substr($strGB, $i, 2) ; $intGB = hexdec(bin2hex($strCurr)) - 0x8080; $strSql = "SELECT code_unicode FROM nnstats_gb_unicode WHERE code_gb = ".$intGB." LIMIT 1" ; $resResult = mysql_query($strSql); if ($arrCode = mysql_fetch_array($resResult)) $strRet .= u2utf8($arrCode["code_unicode"]); else $strRet .= "?? "; $i++; } else { $strRet .= $strGB{$i}; } } return $strRet; } function GB2UTF8_FILE($strGB) { if (!trim($strGB)) return $strGB; $arrLines = file("gb_unicode.txt"); foreach ($arrLines as $strLine) { $arrCodeTable[hexdec(substr($strLine, 0, 6))] = hexdec(substr($strLine, 7, 6)); } $strRet = ""; $ intLen = strlen($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]); else $strRet .= "??"; $i++; } else { $strRet .= $strGB{$i}; } } return $strRet; } function EncodeIp($strDotquadIp) { $arrIpSep = explode('.', $strDotquadIp); if (count($ arrIpSep) != 4) return 0; $intIp = 0; foreach ($arrIpSep as $k => $v) $intIp += (int)$v * pow(256, 3 - $ k); return $intIp; //return sprintf('%02x%02x%02x%02x', $arrIpSep[0], $arrIpSep[1], $arrIpSep[2], $arrIpSep[ 3]); } function GetMicroTime() { list($msec, $sec) = explode(" ", microtime()); return ((double)$msec + ( double)$sec); } for ($i = 0; $i < 100; $i++) { // Randomly generate 100 ip addresses $strIp = mt_rand(0, 255) .".".mt_rand(0, 255).".".mt_rand(0, 255).".".mt_rand(0, 255); $arrAddr[$i] = ip2addr(EncodeIp($strIp )); } $resConn = mysql_connect("localhost", "netnest", "netnest"); mysql_select_db("test"); // Evaluate the encoding conversion of MySQL queries $dblTimeStart = GetMicroTime(); for ($i = 0; $i < 100; $i++) { $strUTF8Region = GB2UTF8_SQL($arrAddr[$i]["region"]); $strUTF8Address = GB2UTF8_SQL($arrAddr[$i]["address"]); } $dblTimeDuration = GetMicroTime() - $dblTimeStart; //The evaluation ends and the results are output echo $dblTimeDuration; echo "rn"; //Coding conversion of evaluation text file query $dblTimeStart = GetMicroTime(); for ($i = 0 ; $i < 100; $i++) { $strUTF8Region = GB2UTF8_FILE($arrAddr[$i]["region"]); $strUTF8Address = GB2UTF8_FILE($arrAddr[$i]["address" ]); } $dblTimeDuration = GetMicroTime() - $dblTimeStart; // The evaluation ends and the results are output echo $dblTimeDuration; echo "rn"; ?> |