可能是iconv遇到有些字無法轉換而導致中斷了
一般來說雙字元的中文用mb_convert_encoding(要被轉得字串, ‘目標編碼’, ‘原本的編碼’);
來轉換,它會把無法轉換的字用「 ?」 替代...
PHP 代碼:
$string = mb_convert_encoding($str_utf8, ‘BIG-5′, ‘UTF-8′);
如果真要用iconv 函數,就得加上「代替字元+跳過」參數://TRANSLIT//IGNORE
PHP 代碼:
$string = iconv("utf-8","big5//TRANSLIT//IGNORE",$str_utf8);
它會把無法轉換的字看看有無可替代的字元,若無則直接跳過...
但是這樣就跟原文有很大的出入了...
另外,要維持文章能確保每個字都能夠顯示,那big5缺字要怎麼搞?
那就必須把big5缺字以 UnicodeHTML 碼代替,這就必須找找網路上先進寫好的函數來轉換...
PHP 代碼:
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=="")?(mb_convert_encoding(substr($utf8_str,$i,3), 'HTML-ENTITIES', 'UTF-8')):$new_word;
$i++;
} else if($sbit > 223 && $sbit < 240) {
$new_word=iconv("UTF-8","Big5",substr($utf8_str,$i,3));
$big5_str.=($new_word=="")?(mb_convert_encoding(substr($utf8_str,$i,3), 'HTML-ENTITIES', 'UTF-8')):$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=="")?(mb_convert_encoding(substr($utf8_str,$i,3), 'HTML-ENTITIES', 'UTF-8')):$new_word;
$i+=3;
}
}
return $big5_str;
}
好,上半部可以存入資料庫了,但是現在文章要顯示,呼叫出來又有一個麻煩了...
下半部就是要解決big5+UnicodeHTML 要怎麼轉 UTF-8
PHP 代碼:
function hex2bin($string) { //16進位轉2進位
$len = strlen($string);
return pack("H".$len, $string);
}
function unicode_str_2_utf8($str) {
$strlen1="";
$str1=explode('&#',$str);
if(count($str1)>1){
foreach($str1 as $k =>$v){
$str2=explode(';',$v);
if(count($str2)>1){
foreach($str2 as $k1 =>$v1){
if(is_numeric($v1)){
$strlen1.=' ';
$unicodeHtml = iconv("ucs-2", "utf-8", hex2bin(base_convert($v1, 10, 16)));
}else{
$unicodeHtml = iconv("big5","utf-8",$v1);
}
$str3.=$unicodeHtml;
}
}else{
$str3.=$v;
$str3=iconv("big5","utf-8",$str3);
}
$str4=$str3;
}
}else{
$str4=iconv("big5","utf-8",$str);
}
return ($str4);
}
你必須要用 unicode_str_2_utf8 來轉換資料,才能正確顯示....