PHP网站制作之GB码转换成UTF
大部分语言的基础,不是说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=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));
}
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=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));
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字符这一步调,放在判别了字符属于西文仍是属于汉字的前提分支里,据此决意截取一个字节仍是三个字节。因而了局准确了!
说说这一个月左右的学习情况和心得吧!我个人认为,既然决定了去做一件事,那就要以认真的态度去对待!既然决定来学习了,那不管当初是抱着怎样的心态来到这个培训班的,都要让自己认真的投入到学习中。 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。 个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。 这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己 ,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
页:
[1]