在《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地址->地理位置转换的测评》一文):
$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进行转码的函数如下: