• 技术文章 >php教程 >php手册

    用php实现gb2312和unicode间的编码转换_php基础

    2016-05-17 09:13:29原创431
    gb2312 和 unicode 间的编码转换
    下面的例子是将 gb2312 转换为 "全"这种形式
    php4.3.1以后的iconv函数很好用的,只是需要自己写一个uft8到unicode的转换函数
    查表(gb2312.txt)也行
    复制代码 代码如下:

    $text = "脚本之家";
    preg_match_all("/[\x80-\xff]?./",$text,$ar);
    foreach($ar[0] as $v)
    echo "&#".utf8_unicode(iconv("GB2312","UTF-8",$v)).";";
    ?>
    // utf8 -> unicode
    function utf8_unicode($c) {
    switch(strlen($c)) {
    case 1:
    return ord($c);
    case 2:
    $n = (ord($c[0]) & 0x3f) << 6;
    $n += ord($c[1]) & 0x3f;
    return $n;
    case 3:
    $n = (ord($c[0]) & 0x1f) << 12;
    $n += (ord($c[1]) & 0x3f) << 6;
    $n += ord($c[2]) & 0x3f;
    return $n;
    case 4:
    $n = (ord($c[0]) & 0x0f) << 18;
    $n += (ord($c[1]) & 0x3f) << 12;
    $n += (ord($c[2]) & 0x3f) << 6;
    $n += ord($c[3]) & 0x3f;
    return $n;
    }
    }
    ?>

    下面的例子是利用php将"全"这中编码转换为gb2312.
    复制代码 代码如下:

    $str = "TTL全天候自动聚焦";
    $str = preg_replace("|&#([0-9]{1,5});|", "\".u2utf82gb(\\1).\"", $str);
    $str = "\$str=\"$str\";";
    eval($str);
    echo $str;
    function u2utf82gb($c){
    $str="";
    if ($c < 0x80) {
    $str.=$c;
    } else if ($c < 0x800) {
    $str.=chr(0xC0 | $c>>6);
    $str.=chr(0x80 | $c & 0x3F);
    } else if ($c < 0x10000) {
    $str.=chr(0xE0 | $c>>12);
    $str.=chr(0x80 | $c>>6 & 0x3F);
    $str.=chr(0x80 | $c & 0x3F);
    } else if ($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 iconv('UTF-8', 'GB2312', $str);
    }
    ?>

    或者是
    复制代码 代码如下:

    function unescape($str) {
    $str = rawurldecode($str);
    preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
    $ar = $r[0];
    print_r($ar);
    foreach($ar as $k=>$v) {
    if(substr($v,0,2) == "%u")
    $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));
    elseif(substr($v,0,3) == "&#x")
    $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,3,-1)));
    elseif(substr($v,0,2) == "&#") {
    echo substr($v,2,-1)."
    ";
    $ar[$k] = iconv("UCS-2","GB2312",pack("n",substr($v,2,-1)));
    }
    }
    return join("",$ar);
    }
    $str = "TTL全天候自动聚焦";
    echo unescape($str); //out TTL全天候自动聚焦

    利用javascript来转换
    复制代码 代码如下:



    Unicode

    文本原型:




    转换代码:




    正向转换





    下面是一个显示所有全角半角的字体的查看例子
    复制代码 代码如下:











    自定义: -





    下面是一个查表(gb2312),转换gb2312到utf8的例子, 现在有iconv函数,这个已经没有太大的意义了,
    复制代码 代码如下:

    function gb2utf8($gb){
    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)-2);
    $utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
    }else{
    $this=substr($gb,0,1);
    $gb=substr($gb,1,strlen($gb)-1);
    $utf8.=u2utf8($this);
    }
    }
    return $utf8;
    }
    function u2utf8($c){
    $str="";
    if ($c < 0x80) {
    $str.=$c;
    } else if ($c < 0x800) {
    $str.=chr(0xC0 | $c>>6);
    $str.=chr(0x80 | $c & 0x3F);
    } else if ($c < 0x10000) {
    $str.=chr(0xE0 | $c>>12);
    $str.=chr(0x80 | $c>>6 & 0x3F);
    $str.=chr(0x80 | $c & 0x3F);
    } else if ($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;
    }
    ?>
    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:gb2312 unicode
    上一篇:PHP程序员一般都忽略了的几点精华_php基础 下一篇:JAVA/JSP学习系列之一_php基础
    大前端线上培训班

    相关文章推荐

    • php中实现api接口思路介绍 • php的memcached扩展• php 备份数据库代码(生成word,excel,json,xml,sql)• php Smarty 字符比较代码• PHP及Zend Engine的线程安全模型分析

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网