一份gb2312.txt(184799位元組)確實顯得太大了點,而且還要經unicode轉換。
這份對照表為51965字節,要小的多了。
對於無法使用iconv函式庫的場合還是很實用的。
//對照表的使用
$filename = "gb2utf8.txt";
$fp = fopen($filename,"r");
while (! feof($fp)) {
list($gb,$utf8) = fgetcsv($fp,10);
$charset[$gb] = $utf8;
}
fclose ($fp);
//以上讀取對照表到數組備用
/**gb2312到utf-8 **/
function gb2utf8($text, &$charset) {
/ /提取文本中的成分,漢字為一個元素,連續的非漢字為一個元素
preg_match_all("/(?:[x80-xff].)|[x01-x7f] /",$text,$tmp );
$tmp = $tmp[0];
//分離出漢字
$ar = array_intersect($tmp, array_keys($charset));
//替換漢字編碼
foreach($ar as $k=>$v)
$tmp[$k] = $charset[$v];
//回傳換碼後的字串
return join('', $tmp);
}
/**utf-8到gb2312 **/
function utf82gb($text, &$charset) {
$p = "/[xf0-xf7][ x80-xbf]{3}|[xe0-xef][x80-xbf]{2}|[xc2-xdf][x80-xbf]|[x01-x7f] /";
preg_match_all($p,$ text,$r);
$utf8 = array_flip($charset);
foreach($r[0] as $k=>$v)
if(isset($utf8[$v]) )
$r[0][$k] = $utf8[$v];
return join('',$r[0]);
}
//測試
$s = gb2utf8('這是對照表的檢定', $charset);
echo utf82gb($s, $charset);
?>