引用 | 编辑
笑笑
2007-05-08 15:42 |
楼主
▼ |
||
![]() 不过我在使用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] ![]()
|