2013/05/08

正確轉出sfs3學務系統big5 utf8

資料來源
http://home.csjs.tc.edu.tw/phpbbinf/viewtopic.php?f=12&p=31892&sid=4ef83dd8380422b6d64371a054527785#p31892



igogo » 週一 5月 06, 2013 1:03 pm
郭兄真的很有熱忱, 讓我很欽佩 ^^

sfs3 big5 轉 utf8 的部份, 我跟tuheng學長在之前維護中文拼音時有遇過
來分享一下輪子 :p

sfs3對中文字的處理態度是這樣, 是big5能編的字, 就直接以big5儲存,但遇到utf8編碼字時,則以十進位的表示值存進資料庫,例如長像這樣
代碼: 
晧 晧

這樣做有個好處, 以網頁呈現時, 各家的瀏灠器都能自動解譯成人眼可視的中文字
所以,一切的一切都是browser都做好了

但是如果你想把big5以iconv 轉成utf8時,會遇到問題
他只能處理屬於 big5的中文字, 剩下&#xxxxx; 的字會原封不動的保留
所以你的前端想以utf8呈現會產生這樣的結果
代碼: 
王小晧


所以必須再檢查是否有十進位表示值的字
代碼: 
<?php
//by moonfish
function parse_name($name){
while(substr_count($name,"#")>0){
        $tt=substr($name,strpos($name,"#")+1,5);
        $name=str_replace("&#".$tt.";",uni2utf8($tt),$name);
}
  return $name;
}

function uni2utf8($string){
    $str = dechex($string);
    $len = strlen($str);

以上是tuheng 學長之前寫的做法

我是偏好OO的寫法
代碼: 
<?php
//by igogo
class Chinese {
  public static function decimal_notation_converting($string){
    $i=1;
    while ($i != 0){
    //print $string;
    $pattern = '/&#\d+\;/';
    preg_match($pattern, $string, $matches);
    $i = sizeof($matches);
      if ($i !=0){
        $unicode_char = mb_convert_encoding($matches[0], 'UTF-8', 'HTML-ENTITIES');
        $string = preg_replace("/$matches[0]/",$unicode_char,$string);
      } //end if
    } //end wile
    return $string;
  }
}
$name = "&#26215;&#27129;";
print Chinese::decimal_notation_converting($name);

?>

理論上,第一個做法比較快,僅是function來處理字串
第二種需要產生物件又用了正規表達較耗資源, 但就是有輪子可以用的感覺

提供這兩種做法參考

沒有留言:

張貼留言