優質團隊專業清潔
打掃迅速全年無休
租屋廣利代書事務所
買賣過戶、繼承贈與設定塗銷、陽台補登

首頁  ‧  j2h 論壇 ‧ 程式設計討論     ‧ 

[教學]big5 轉 utf-8 之方法

房東:小胖
發表時間:2010-06-01


最近因為要寫一個應用程式,他必須把網頁傳送過來的資料轉為 utf-8 再處理,
一般 big5 轉 utf-8 用 iconv 函數就可以處理,但有一種情形,就是如果 big5 字串中如果有 &# 就無法轉換
所以我特別寫了一個轉換程式

function big5_2_utf8($big5_str) {
$sw["廖"]="廖";
$sw["碁"]="碁";
$sw["粧"]="粧";
$sw["裏"]="裏";
$sw["墻"]="墻";
$sw["恒"]="恒";
$sw["銹"]="銹";
$sw["嫺"]="嫺";
$sw["╔"]="╔";
$sw["╦"]="╦";
$sw["╗"]="╗";
$sw["╠"]="╠";
$sw["╬"]="╬";
$sw["╣"]="╣";
$sw["╚"]="╚";
$sw["╩"]="╩";
$sw["╝"]="╝";
$sw["╒"]="╒";
$sw["╤"]="╤";
$sw["╕"]="╕";
$sw["╞"]="╞";
$sw["╪"]="╪";
$sw["╡"]="╡";
$sw["╘"]="╘";
$sw["╧"]="╧";
$sw["╛"]="╛";
$sw["╓"]="╓";
$sw["╥"]="╥";
$sw["╖"]="╖";
$sw["╟"]="╟";
$sw["╫"]="╫";
$sw["╢"]="╢";
$sw["╙"]="╙";
$sw["╨"]="╨";
$sw["╜"]="╜";
$sw["║"]="║";
$sw["═"]="═";
$sw["╔"]="╔";
$sw["╗"]="╗";
$sw["╚"]="╚";
$sw["╝"]="╝";
$sw["█"]="█";
$sw["€"]="€";
$sw["/"]="/";

$len=strlen($big5_str);
$un='';
for ($i=0;$i<$len;$i++) {
$s =substr($big5_str,$i,1);
$s1 =substr($big5_str,$i,2);
$sbit=ord($s);
if ($sbit < 0x80) {
$un.=$s;
} else {
$new_word=iconv("BIG5","UTF-8",$s1);
if(!$new_word){
if($sw[$s1]) $new_word=$sw[$s1];
}
if($new_word!=''){
$un.=$new_word;
$i++;
}
}
}
$s='';
while(strlen($un)>0){
$p=strpos($un,"&#");
if ($p===false) {
$s.=$un;
return $s;
}
else{
if ($p!=0){
$s.=substr($un,0,$p);
$un=substr($un,$p);
}
$p=strpos($un,";");
if ($p===false){
$s.=$un;
return $s;
}
else{
$code=substr($un,2,$p-2);
$un=substr($un,$p+1);
if (strcasecmp($code{0},"x")==0){
$code=hexdec(substr($code,1));
}
else{
$code=intval($code);
}
if($code <= 0x7f){
$s.=chr($code);
}
elseif($code <= 0x7ff){
$s.=chr(($code >> 6) | 0xc0);
$s.=chr(($code % 0x40) | 0x80);
}
elseif($code <= 0xffff){
$s.=chr( ($code >> 12) | 0xe0);
$s.=chr((($code >> 6) % 0x40) | 0x80);
$s.=chr( ($code % 0x40) | 0x80);
}
elseif($code <= 0x10ffff){
$s.=chr( ($code >> 18) | 0xf0);
$s.=chr((($code >> 12) % 0x40) | 0x80);
$s.=chr((($code >> 6) % 0x40) | 0x80);
$s.=chr( ($code % 0x40) | 0x80);
}
}
}
}
return $s;
}






  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務

  • 1 樓住戶:小貓
    發表時間:2010-06-01

    因為目前論壇的編碼是 Big-5 ,為了跟綠界的便利超商付費機制結合,而不巧,他的編碼是 UTF-8,所以我傳過去的參考全變成亂碼,所以我不得已只好寫一個轉碼頁面,有需求的可以參考使用..

    $pay_sob=iconv('BIG5','UTF-8',$pay_sob);
    $pay_name=iconv('BIG5','UTF-8',$pay_name);
    ?>

    待會將會引導您至便利超商付費畫面,請耐心等侯...












    2 樓住戶:阿寶
    發表時間:2010-06-01

    最近寫程式會用到 utf8 轉 big5,本來想說用iconv就好了

    不過我在使用iconv,將utf8轉big5時就出現一個問題,就是只要遇到utf8轉big5,沒有對應的big5碼的時候就有狀況了,原本以為就那個字沒出現,結果是當對應不到big5碼後它是以後的通通不見了,當然這下子就不妙了。

    最後我只好一個字一個字轉,然後遇到沒有對應的碼就用"■"代替,雖然損失了效能,但是卻確保了正確性。

    本文參考自 http://203.68.102.46/online_book/content.php?chapter_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]



     共 2 人回應  選擇頁數 【第1 頁】 

    姓名:
    佈告內容:
    其他選項: