仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 799|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网站制作之php对gb编码静态转utf-8编码的几种办法...

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:38:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
会有很多高手的鼓励,新手的支持,慢慢你劲头就十足,有更多的信心和兴趣去学。     在《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 "\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的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-21 10:41:26 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
灵魂腐蚀 该用户已被删除
6#
发表于 2015-3-8 22:44:21 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
不帅 该用户已被删除
7#
发表于 2015-3-11 07:45:46 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
蒙在股里 该用户已被删除
8#
发表于 2015-3-17 23:10:32 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
若相依 该用户已被删除
9#
发表于 2015-3-18 17:30:23 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
精灵巫婆 该用户已被删除
10#
发表于 2015-3-25 05:38:39 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
若天明 该用户已被删除
11#
发表于 2015-3-27 03:10:53 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
海妖 该用户已被删除
12#
发表于 2015-4-1 00:08:29 | 只看该作者
做为1门年轻的语言,php一直很努力。
深爱那片海 该用户已被删除
13#
发表于 2015-4-16 02:22:06 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
变相怪杰 该用户已被删除
14#
发表于 2015-4-16 20:54:21 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
再见西城 该用户已被删除
15#
发表于 2015-4-21 16:51:09 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
16#
发表于 2015-5-1 06:17:39 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
山那边是海 该用户已被删除
17#
发表于 2015-5-1 12:12:07 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
愤怒的大鸟 该用户已被删除
18#
发表于 2015-5-4 02:08:33 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
再现理想 该用户已被删除
19#
发表于 2015-5-6 09:12:46 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
第二个灵魂 该用户已被删除
20#
发表于 2015-6-4 08:00:56 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表