今天忙着改一个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的书~~再加上连翻带找,拼出这么一个程序~~~大家看着玩玩儿吧~~有错误的话一定要告诉我哦~~~
另附GB2312.TXT文件~~