最近写程式会用到 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]