广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 18524 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
笑笑 会员卡 葫芦墩家族
个人文章 个人相簿 个人日记 个人地图
发文大师奖
头衔:    
风云人物
级别: 风云人物 该用户目前不上站
推文 x137 鲜花 x523
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[PHP][原码] utf8转big5之方法
最近写程式会用到 utf8 转 big5,本来想说用iconv就好了

不过我在使用iconv,将utf8转big5时就出现一个问题,就是只要遇到utf8转big5,没有对应的big5码的时候就有状况了,原本以为就那个字没出现,结果是当对应不到big5码后它是以后的通通不见了,当然这下子就不妙了。

最后我只好一个字一个字转,然后遇到没有对应的码就用"■"代替,虽然损失了效能,但是却确保了正确性。

本文参考自 http://203.68.102.46/online_book...hapter_sn=173 感谢 JENY's

复制程式
  //逐字转换utf8字串为big5
        function  utf8_2_big5($utf8_str)  {
                $i=0;
                $len  =  strlen($utf8_str);
                $big5_str="";
                for  ($i=0;$i<$len;$i++)  {
                        $sbit  =  ord(substr($utf8_str,$i,1));
                        if  ($sbit  <  128)  {
                                $big5_str.=substr($utf8_str,$i,1);
                        }  else  if($sbit  >  191  &&  $sbit  <  224)  {
                                $new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,2));
                                $big5_str.=($new_word=="")?"■":$new_word;
                                $i++;
                        }  else  if($sbit  >  223  &&  $sbit  <  240)  {
                                $new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,3));
                                $big5_str.=($new_word=="")?"■":$new_word;
                                $i+=2;
                        }  else  if($sbit  >  239  &&  $sbit  <  248)  {
                                $new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,4));
                                $big5_str.=($new_word=="")?"■":$new_word;
                                $i+=3;
                        }
                }
                return  $big5_str;
    }  

因为个人需求,当 utf-8 转 big5 时,对应不到的字,我想要改用   $len = strlen($utf8_str);
    $big5_str="";
    for ($i=0;$i<$len;$i++) {
        $s =substr($utf8_str,$i,1);
        $s1=substr($utf8_str,$i+1,1);
        $s2=substr($utf8_str,$i+2,1);
        $s3=substr($utf8_str,$i+3,1);
        $sbit=ord($s);
        if ($sbit < 0x80) {
            $big5_str.=$s;
        } else if($sbit >= 0xc0 && $sbit < 0xe0) {
            $new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,2));
            $big5_str.=$new_word?$new_word:
                '&#'.(((ord($s) & 0x1f) * 0x40) + (ord($s1) & 0x3f)).''
            $i++;
        } else if($sbit >= 0xe0 && $sbit < 0xf0) {
            $new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,3));
            $big5_str.=$new_word?$new_word:
                '&#'.(((ord($s) & 0x0f) * 0x1000) + ((ord($s1) & 0x3f) * 0x40) + (ord($s2) & 0x3f)).''
            $i+=2;
        } else if($sbit >= 0xf0 && $sbit < 0xf8) {
            $new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,4));
            $big5_str.=$new_word?$new_word:
                '&#'.(((ord($s) & 0x07) * 0x40000) + ((ord($s1) & 0x3f) * 0x1000) + ((ord($s2) & 0x3f) * 0x40) + (ord($s3) & 0x3f)).''
            $i+=3;
        }
    }
    return $big5_str;
}
[/code][/sell]



每天大笑三声,可以让你更长寿哦...^^
献花 x0 回到顶端 [楼 主] From:台湾新世纪资通股份有限公司 | Posted:2007-05-08 15:42 |
天空星星
数位造型
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

谢谢楼主的分享
先收藏起来研究学习用
感谢 表情


★★
献花 x0 回到顶端 [1 楼] From:台湾中华电信 | Posted:2007-11-15 11:39 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.030294 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言