Home  >  Article  >  Backend Development  >  Evaluation of several methods of dynamically converting GB encoding to UTF-8 encoding in PHP_PHP Tutorial

Evaluation of several methods of dynamically converting GB encoding to UTF-8 encoding in PHP_PHP Tutorial

WBOY
WBOYOriginal
2016-07-21 14:57:19766browse

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";
?>





Two evaluation results (accurate to 3 decimal places, unit is second):

MySQL query conversion: 0.112
Text query conversion: 10.590

MySQL query conversion: 0.099
Text query conversion: 10.623

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/364036.htmlTechArticleIn the article "Evaluation of IP Address-Geographical Location Conversion", it is mentioned that the ip2addr function is used to directly read the IP database file It is the most efficient. Compared with using MySQL database to store IP data, using SQL query is more efficient...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn