廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 18538 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為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.068067 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言