谁可相欹 发表于 2015-2-3 23:38:05

PHP网站制作之php对gb编码静态转utf-8编码的几种办法...

会有很多高手的鼓励,新手的支持,慢慢你劲头就十足,有更多的信心和兴趣去学。     在《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, 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, $arrIpSep, $arrIpSep, $arrIpSep);
}
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 "\r\n";
// 测评文本文件查询的编码转换
$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 "\r\n";
?>
测评两次了局(准确到3位小数,单元是秒):
MySQL查询转换:0.112
文本查询转换:10.590
MySQL查询转换:0.099
<P>文本查询转换:10.623 1 2 下一页 >全文浏览 提醒:尝尝"← →"键,翻页更便利哦! 我想在讲述自己的学习方式前,对那些期望能从我的文章中获得有用信息的人说一句心里话:

冷月葬花魂 发表于 2015-2-4 04:01:09

Ps:以上纯属原创,如有雷同,纯属巧合

乐观 发表于 2015-2-9 15:45:52

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

老尸 发表于 2015-2-15 14:26:25

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

金色的骷髅 发表于 2015-2-21 10:41:26

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

灵魂腐蚀 发表于 2015-3-8 22:44:21

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

不帅 发表于 2015-3-11 07:45:46

为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。

蒙在股里 发表于 2015-3-17 23:10:32

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

若相依 发表于 2015-3-18 17:30:23

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

精灵巫婆 发表于 2015-3-25 05:38:39

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

若天明 发表于 2015-3-27 03:10:53

基础有没有对学习php没有太大区别,关键是兴趣。

海妖 发表于 2015-4-1 00:08:29

做为1门年轻的语言,php一直很努力。

深爱那片海 发表于 2015-4-16 02:22:06

有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。

变相怪杰 发表于 2015-4-16 20:54:21

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

再见西城 发表于 2015-4-21 16:51:09

开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。

仓酷云 发表于 2015-5-1 06:17:39

兴趣是最好的老师,百度是最好的词典。

山那边是海 发表于 2015-5-1 12:12:07

学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql

愤怒的大鸟 发表于 2015-5-4 02:08:33

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

再现理想 发表于 2015-5-6 09:12:46

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

第二个灵魂 发表于 2015-6-4 08:00:56

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
页: [1]
查看完整版本: PHP网站制作之php对gb编码静态转utf-8编码的几种办法...