仓酷云

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

[学习教程] PHP网站制作之GB码转换成UTF

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

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

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

x
大部分语言的基础,不是说c有多好,而是c相对起手容易学,让你认为这个是编程语言,转换    很早之前找到一个把GB码转化为UTF-8的函数,共同一个GB到UNICODE的对比表(gb2312.txt),用于在GD中输入汉字。后来发明在欲输入的内容中含有西文字符时,会呈现凌乱。后来找到了修正后的代码,处理了成绩。现将两个函数做一对照剖析以下。

起首,这是一个UNICODE到UTF-8编码转换的函数,这一局部修正前后没有变更:
function u2utf8($c)
{
for($i=0;$i<count($c);$i++)
$str="";
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=(0xC0 | $c>>6);
$str.=(0x80 | $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=(0xE0 | $c>>12);
$str.=(0x80 | $c>>6 & 0x3F);
$str.=(0x80 | $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=(0xF0 | $c>>18);
$str.=(0x80 | $c>>12 & 0x3F);
$str.=(0x80 | $c>>6 & 0x3F);
$str.=(0x80 | $c & 0x3F);
}
return $str;
}

这里完整是依照UTF-8编码的划定规矩,经由过程判别字符属于分歧的UNICODE编码段局限,停止分歧的移位和位与操作,以转化为UTF-8编码。关于该划定规矩可参考http://www.utf8.org/上的申明。

这是修正前的GB转化为UTF-8编码的函数,个中挪用了下面的u2utf8函数。
function gb2utf8($gb)     /* Program writen by sadly www.phpx.com  */
{
if(!trim($gb))
return $gb;
$filename="gb2312.txt";
$tmp=file($filename);
$codetable=array();
while(list($key,$value)=each($tmp))
$codetable[hexdec(substr($value,0,6))]=substr($value,7,6);
$utf8="";
while($gb)
{
if (ord(substr($gb,0,1))>127)
{
$this=substr($gb,0,2);
$gb=substr($gb,2,strlen($gb));
$utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
}
else
{
$gb=substr($gb,1,strlen($gb));
$utf8.=u2utf8(substr($gb,0,1));
}
}

$ret="";
for($i=0;$i<strlen($utf8);$i+=3)
$ret.=chr(substr($utf8,$i,3));

return $ret;
}
函数中while轮回局部,把汉字逐一依照“对比表”转化为UNICODE,再经由过程u2utf8函数转化为UTF-8。但从中可以看出,while轮回停止后,又用一个for轮回,把每三个字节分解了一个UTF-8字符(见http://www.utf8.org/上的划定规矩申明,每一个汉字的UTF-8编码为三字节),没有思索到个中的西文字符(西文字符的UTF-8编码为一字节)。所以,假如欲输入的内容中不管是入手下手时呈现西文字符,或是汉字傍边交叉西文字符,转化为UTF-8后,城市被依照“每三个字节截取”的体例截开,招致乱码。


以下是修正后的函数:
function gb2utf8($gb)    /* Program writen by sadly   modified by agun */
{
if(!trim($gb))
return $gb;
$filename="gb2312.txt";
$tmp=file($filename);
$codetable=array();
while(list($key,$value)=each($tmp))
$codetable[hexdec(substr($value,0,6))]=substr($value,7,6);

$ret="";
$utf8="";
while($gb)
{
if (ord(substr($gb,0,1))>127)
{
$this=substr($gb,0,2);
$gb=substr($gb,2,strlen($gb));
$utf8=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
for($i=0;$i<strlen($utf8);$i+=3)
$ret.=chr(substr($utf8,$i,3));
}
else
{
$ret.=substr($gb,0,1);
$gb=substr($gb,1,strlen($gb));
}
}
return $ret;
}

修正后的函数将 GB转化为UNICODE、UNICODE转化为UTF-8、几个字节分解一个UTF-8字符,这三个步调在一个轮回里完成,特别是几个字节分解一个UTF-8字符这一步调,放在判别了字符属于西文仍是属于汉字的前提分支里,据此决意截取一个字节仍是三个字节。因而了局准确了!

说说这一个月左右的学习情况和心得吧!我个人认为,既然决定了去做一件事,那就要以认真的态度去对待!既然决定来学习了,那不管当初是抱着怎样的心态来到这个培训班的,都要让自己认真的投入到学习中。
小魔女 该用户已被删除
沙发
发表于 2015-2-4 09:57:09 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
小妖女 该用户已被删除
板凳
发表于 2015-2-4 19:03:03 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
admin 该用户已被删除
地板
发表于 2015-2-8 20:31:01 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
老尸 该用户已被删除
5#
发表于 2015-2-10 05:08:10 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
再现理想 该用户已被删除
6#
发表于 2015-2-27 05:13:34 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
乐观 该用户已被删除
7#
发表于 2015-3-2 20:48:27 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
透明 该用户已被删除
8#
发表于 2015-3-4 04:07:32 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
活着的死人 该用户已被删除
9#
发表于 2015-3-11 16:21:33 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
山那边是海 该用户已被删除
10#
发表于 2015-3-19 19:08:19 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
蒙在股里 该用户已被删除
11#
发表于 2015-4-1 00:09:24 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
飘灵儿 该用户已被删除
12#
发表于 2015-4-5 18:56:06 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
变相怪杰 该用户已被删除
13#
发表于 2015-4-22 23:49:03 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
爱飞 该用户已被删除
14#
发表于 2015-4-24 06:44:37 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
若天明 该用户已被删除
15#
发表于 2015-5-4 16:08:38 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
若相依 该用户已被删除
16#
发表于 2015-5-8 20:56:22 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
海妖 该用户已被删除
17#
发表于 2015-6-9 18:17:02 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
深爱那片海 该用户已被删除
18#
发表于 2015-6-11 02:40:58 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
简单生活 该用户已被删除
19#
发表于 2015-6-30 04:00:32 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
兰色精灵 该用户已被删除
20#
发表于 2015-7-7 11:36:59 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-30 02:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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