在《IP地址->地理位置转换的测评》一文中提到用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地址->地理位置转换的测评》一文):
<?php 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++) { // 随机产生100个ip地址 $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"); // 测评MySQL查询的编码转换 $dblTimeStart = GetMicroTime(); for ($i = 0; $i < 100; $i++) { $strUTF8Region = GB2UTF8_SQL($arrAddr[$i]["region"]); $strUTF8Address = GB2UTF8_SQL($arrAddr[$i]["address"]); } $dblTimeDuration = GetMicroTime() – $dblTimeStart; // 测评结束并输出结果 echo $dblTimeDuration; echo ""; // 测评文本文件查询的编码转换 $dblTimeStart = GetMicroTime(); for ($i = 0; $i < 100; $i++) { $strUTF8Region = GB2UTF8_FILE($arrAddr[$i]["region"]); $strUTF8Address = GB2UTF8_FILE($arrAddr[$i]["address"]); } $dblTimeDuration = GetMicroTime() – $dblTimeStart; // 测评结束并输出结果 echo $dblTimeDuration; echo ""; ?> |
测评两次结果(精确到3位小数,单位是秒):
MySQL查询转换:0.112
文本查询转换:10.590
MySQL查询转换:0.099
文本查询转换:10.623
波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
波比源码 » php对gb编码动态转utf-8编码的几种方法评测
波比源码 » php对gb编码动态转utf-8编码的几种方法评测
levaquin cost oral levaquin 250mg
dutasteride order online buy celecoxib 100mg online cheap zofran cheap
spironolactone 100mg price valtrex tablet fluconazole medication
ampicillin 500mg brand buy cephalexin 125mg generic buy erythromycin 250mg without prescription
buy sildenafil 100mg buy sildenafil online cheap robaxin us
suhagra 50mg cost aurogra 50mg tablet estrace 1mg generic
lamotrigine 50mg tablet order prazosin buy generic tretinoin
tadalafil online order generic tadacip order diclofenac 100mg pills
indocin generic buy cefixime buy trimox pills
arimidex 1mg cheap Viagra pfizer usa viagra overnight
order prednisone 10mg online cheap brand sildenafil 50mg purchase sildenafil generic
buy modafinil 100mg generic order modafinil 100mg for sale diamox 250mg tablet
order doxycycline 200mg buy lasix 40mg generic lasix over the counter
order generic buspirone 5mg ditropan 2.5mg without prescription purchase oxybutynin without prescription
order terazosin 5mg without prescription actos usa order azulfidine 500mg generic
alendronate 70mg over the counter order paracetamol 500 mg pill purchase pepcid generic
order benicar pill buy olmesartan 20mg without prescription buy diamox 250mg without prescription
prograf pill order prograf 1mg for sale urso 300mg tablet
zyban medication cetirizine 10mg pills order quetiapine 100mg
buy molnunat for sale buy molnunat generic lansoprazole 15mg sale
imuran 100mcg oral order sildenafil 100mg online sildenafil 100mg england
tadalafil 10mg us Cialis fast delivery sildenafil 100mg canada
order tadalafil 5mg without prescription tadalafil us buy symmetrel 100mg pills
buy revia 50mg for sale revia 50 mg tablet order abilify
avlosulfon 100mg pill order aceon 4mg pills order generic aceon 4mg
order medroxyprogesterone 5mg pills buy cyproheptadine without prescription periactin over the counter
purchase accutane generic accutane drug purchase prednisone for sale
nootropil buy online order generic sildenafil viagra 100mg for sale
cheap tadalafil without prescription cheapest viagra oral sildenafil 100mg
furosemide us buy doxycycline 100mg pill order plaquenil online
buy tadalafil 40mg for sale buy tadalafil 10mg for sale order anafranil 25mg
buy aralen for sale chloroquine tablet order baricitinib 2mg generic
sporanox online buy tinidazole 500mg without prescription tinidazole oral
buy generic clozaril order generic ipratropium order generic dexamethasone 0,0,5 mg
sildenafil 100mg generic sildenafil 100mg brand lisinopril 10mg
generic zyvox 600mg linezolid 600 mg generic slot online
buy prilosec 20mg online cheap my mother essay writing best no deposit free spins
cheap custom essay buy term papers online play poker online real money
academicwriting order sildenafil 100mg without prescription order viagra 100mg generic
cheap cialis pill buy cialis 5mg without prescription viagra overnight shipping usa
tadalafil cost order generic viagra sildenafil 50mg generic
purchase xenical sale order xenical 120mg generic order zovirax sale
canadian cialis online pharmacy cheap cialis 5mg generic plavix 150mg
order allopurinol online buy allopurinol 300mg generic cheap ezetimibe 10mg
methotrexate online order order generic methotrexate 2.5mg generic reglan 20mg
order colchicine generic best online blackjack real money gambling game
zantac pills order zantac 300mg pills purchase celecoxib
metronidazole 200mg usa buy metronidazole 200mg without prescription bactrim pills
diflucan 100mg tablet viagra for sale order viagra online cheap
cephalexin over the counter buy cephalexin 250mg generic erythromycin canada
generic tadalafil cost viagra 50mg viagra 150mg price
ceftin tablet cefuroxime for sale online methocarbamol cheap
sildalis ca sildenafil brand buy lamotrigine 200mg for sale
buy prednisone 10mg purchase amoxil pill amoxicillin oral
best online gambling sites buy ed pills for sale cialis canada
azithromycin 250mg cheap azithromycin us order neurontin 100mg generic
sildenafil 50mg for sale purchase fildena online cheap rhinocort brand