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呈現會產生這樣的結果
所以必須再檢查是否有十進位表示值的字
以上是tuheng 學長之前寫的做法
我是偏好OO的寫法
理論上,第一個做法比較快,僅是function來處理字串
第二種需要產生物件又用了正規表達較耗資源, 但就是有輪子可以用的感覺
提供這兩種做法參考
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 = "晧槹";
print Chinese::decimal_notation_converting($name);
?>
理論上,第一個做法比較快,僅是function來處理字串
第二種需要產生物件又用了正規表達較耗資源, 但就是有輪子可以用的感覺
提供這兩種做法參考
沒有留言:
張貼留言