主题 : [原创]其实只是一半原创~~~:D:D
枯れない花
级别: 论坛版主
UID: 11
精华: 0
发帖: 2266
威望: 8 星
金钱: 381185 浮游币
贡献值: 8813 点
好评度: 7896 点
人气: 1049 点
在线时间: 1384(时)
注册时间: 2004-03-24
最后登录: 2023-04-20
楼主  发表于: 2004-09-04 20:24

[原创]其实只是一半原创~~~:D:D

今天忙着改一个vbb论坛,想找个GB=>utf-8的转换软件,希望只转换汉字,而英文部分,不转换成UTF-8编码~~~忙乎了半天,找转换软件,未果~~~只好自己动手~~~
参考了www.php.net上面的程序,不过他那个只能转换中文,不能中英文一起转~~~稍微作了些手脚,希望不会有bug~~~

代码

<?

//Program writen by sadly www.phpx.com
//modified by Taburiss www.chinaemu.org

//通过将编码对照表读入数组,然后进行查询-〉替换,从而实现GB2312->UTF-8的转换~~

function gb2utf8($gb)
{

//前面这段,只是把全角文字,分成2个16进制位,将其所对应的Unicode十进制数写入$uni字符串~~
//半角文字都不变~~前端加入标注FF(因为Unicode里面,没有使用FF~~),再写入$uni字符串~~

     if(!trim($gb))
 return $gb;
     $filename="gb2312.txt";                    
     //这个是gb2312.txt是GB2312和utf-8编码对照表
     //是Unicode Inc. 发表的~~
     //至于后面那个 0x8080的来历,在这个表里面也有相关说明滴~~
     $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)
 {
       $U2Gthis=substr($gb,0,2);
       $gb=substr($gb,2,strlen($gb));
       $uni.=u2utf8(hexdec($codetable[hexdec(bin2hex($U2Gthis))-0x8080]));
 }
 else
 {
       $uni.=chr(255).substr($gb,0,1);
       $gb=substr($gb,1,strlen($gb));
 }
     }

//将unicode的10进制编码,转换为UTF-8字符,因为Unicode对应双字节文字,第一个16进制位,
//一定是一个大于127的3位十进制数,所以,处理$uni的时候,双字节文字,要处理3位,而前面
//对于127以内的数字,都进行了前缀标注,只要处理到这样的位,就将前缀跳过,然后把下一位写
//入结果集$utf8,一次处理2位,这样就可以有效的分辨半角文字和全角文字了~~~
     $utf8="";
     $i = 0;
     while($i<strlen($uni))
     {
 if (ord(substr($uni,$i,1)) != 255)
 {
       $utf8.=chr(substr($uni,$i,3));
       $i+=3;
 }
 else
 {
       $utf8.=substr($uni,$i+1,1);
       $i+=2;
 }
     }
     return $utf8;
}


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;
}
?>


前阵子看了能有1个礼拜关于PHP的书~~再加上连翻带找,拼出这么一个程序~~~大家看着玩玩儿吧~~有错误的话一定要告诉我哦~~~ kaixin.gif kaixin.gif
另附GB2312.TXT文件~~
附件: gb2312.txt (176 K) 下载次数:3