快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

乐虎唯一官方网站游戏:用PHP对GB编码到UTF8编码的动态转换



用ip2addr函数直接读取IP数据库文件是效率最高的,比拟用MySQL数据库存储IP数据,用SQL查询是效率最低的。然则IP数据库文件QQWry.dat是GB2312编码的。现在我必要UTF-8编码的地舆位置结果。假如用MySQL措施,可以在数据存入数据库时就转换为UTF-8编码,一劳永逸。然则QQWry.dat文件又无法改动,只能把ip2addr函数的输出结果再进行动态转换。

动态转换GB->UTF-8编码至少有四种措施:

用PHP的iconv扩展转换

用PHP的mb_string扩展转换

用对换表转换,对换表存储在MySQL数据库中

用对换表转换,对换表存储在文本文件中

前两种措施要办事器作了响应设置(编译安装了响应扩展)才能应用。我的虚拟主机没有这两个扩展,只好斟酌后两种措施。前两个措施本文也不进行测评。

测评法度榜样如下(func_ip.php拜见《IP地址->地舆位置转换的测评》一文):

> 6);

$str .= chr(0x80 | $c & 0x3F);

} elseif ($c > 12);

$str .= chr(0x80 | $c >> 6 & 0x3F);

$str .= chr乐虎唯一官方网站游戏(0x80 | $c & 0x3F);

} elseif ($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; $i127) {

$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_que乐虎唯一官方网站游戏ry($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; $i127) {

$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

测评两次结果(正确到3位小数,单位是秒):

MySQL查询转换:0.112

文本查询转换:10.590

MySQL查询转换:0.099

文本查询转换:10.623

可见此次是MySQL措施遥遥领先于文件查询法。然则现在还不急于应用MySQL措施,由于文本文件措施之以是如斯耗时,主要由于它每次转换都要把全部gb_unicode.txt读入内存,而gb_unicode.txt又是文本文件,款式如下:

0x2121  0x3000  # IDEOGRAPHIC SPACE

0x2122  0x3001  # IDEOGRAPHIC COMMA

0x2123  0x3002  # IDEOGRAPHIC FULL STOP

0x2124  0x30FB  # KATAKANA MIDDLE DOT

0x2125  0x02C9  # MODIFIER LETTER MACRON (Mandarin Chinese first tone)

……

0x552A  0x6458  #

0x552B  0x658B  #

0x552C  0x5B85  #

0x552D  乐虎唯一官方网站游戏0x7A84  #

……

0x777B  0x9F37  #

0x777C  0x9F3D  #

0x777D  0x9F3E  #

0x777E  0x9F44  #

文本文件效率较低,于是斟酌把文本文件乐虎唯一官方网站游戏转换为二进制文件,然后用对折法查找这个文件,而不必要把全部文件读入内存。文件款式为:文件头2字节,存储记录数;接着一条接一笔记录存入文件,每笔记录4字节,前2字节对应GB代码,后2字节对应Unicode代码。转换法度榜样如下:

$v) {

$strData = chr($k % 256) . chr(floor($k / 256)) . chr($v % 256) . chr(floor($v / 256));

fwrite($fileGBU, $strData乐虎唯一官方网站游戏);

}

fclose($fileGBU);

?>

履行法度榜样后就得到了二进制的GB->Unicode对比表gbu.dat,并且数据记录按GB代码排了序,便于对折法查找。应用gbu.dat进行转码的函数如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: