使用 iconv 進行 UTF-8 <---> big5 或 UTF-8 <---> gb2312 轉碼時,常會因為查不到對應字集,而使輸出中斷。
使用 //IGNORE 可以忽略 iconv 轉碼錯誤,讓整段文字的輸出不會中斷。
但是有錯誤的地方會以@顯示。 
◎ 範例
iconv("UTF-8", "big5//IGNORE", $str);
iconv("big5","UTF-8//IGNORE",$str_big5);
iconv("UTF-8", "gb2312//IGNORE", $str);
iconv("gb2312","UTF-8//IGNORE",$str_gb);
另外也可以使用//TRANSLIT來取得替代的字碼,若無替代字可顯示,轉碼動作即停止,並產生提示警訊。但是在中文字上使用,常會因為查不到對應字集,而使輸出中斷。
◎ 範例
iconv("UTF-8", "big5//TRANSLIT", $str);
iconv("big5","UTF-8//TRANSLIT",$str_big5);
iconv("UTF-8", "gb2312//TRANSLIT", $str);
iconv("gb2312","UTF-8//TRANSLIT",$str_gb);
 //IGNORE跟//TRANSLIT是可以合併使用的。
//TRANSLIT:當轉碼查不到對應字集時,會先嘗試取得替代的字碼。例如,UTF-8歐元符號 € 嘗試轉成 BIG5 時,因為 BIG5碼並無歐元符號,於是以替代字 EUR 顯示。
//IGNORE:若無替代字可顯示時,則忽略錯誤繼續其他文字的轉碼。
◎ 範例
iconv("UTF-8", "big5//TRANSLIT//IGNORE", $str);
iconv("big5","UTF-8//TRANSLIT//IGNORE",$str_big5);
iconv("UTF-8", "gb2312//TRANSLIT//IGNORE", $str);
iconv("gb2312","UTF-8//TRANSLIT//IGNORE",$str_gb);
--------------------------------------------------------------------------------------------------------------------------------------------------------------
【延伸閱讀】:這裡有一篇關於//IGNORE跟//TRANSLIT的詳細介紹,UTF-8 轉 BIG5 碼 的問題 & 解決方法http://www.ps3w.net/modules/psbb/?op=openthr&lead=1109
----------- 以下轉載全文 -----------------
這篇文章主要探討 UTF-8 轉 BIG5 碼 的問題 並提供 幾種 解決方法 ...

UTF-8 編碼 (Unicode),又稱「統一碼」或「萬國碼」。

 關於「什麼是Unicode萬國碼」,可參考 ... 
Unicode 萬國碼 學術學會
http://unicode.org/standard/translations/t-chinese.html

維基百科
http://zh.wikipedia.org/zh-tw/UTF-8


 UTF-8 與 Unicode 請參考 ... 
【問題】請問big5, unicode and unicode UTF-8 的差異
http://www.pczone.com.tw/vbb3/thread/47/122399/2/

Unicode、UTF-8、UCS等字的意義
http://uao.cpatch.org/index.php?Unicode%E3%80%81UTF-8%E3%80%81UCS%E7%AD%89%E5%AD%97%E7%9A%84%E6%84%8F%E7%BE%A9

【教學】Big5 與 UTF-8 之差異簡述
http://www.twvbb.com/vbb/thread/30/603/


要使用 PHP 將台灣繁體中文專用編碼 BIG5 或簡體中文GB2312/GBK碼 轉成UTF-8萬國碼,都是很容易的事。

在PHP中最常用來進行各種文字編碼之間的轉換函式應該就是 iconv()

在 PHP 裏的 iconv() 函式是由 libiconv library 提供;無論是在 台灣、香港、大陸,或美國 ... 目前絕大部份的主機商應該都有開放此函式庫給虛擬主機戶使用;假如是自架主機,就要確定當初安裝編譯PHP時有 --with-iconv[=DIR] 方能支援此轉碼用函式庫。

 iconv (PHP 4 >= 4.0.5) 
用途︰
  轉換文字資料的編碼格式
用法︰
  (輸出傳回:文字形態資料) [string] iconv('來源編碼格式', '目標編碼格式', '輸入文字資料')
說明︰
  將 '輸入文字資料' 由 '來源編碼格式' 轉換為 '目標編碼格式';傳回 '輸入文字資料' 經轉換成 '目標編碼格式' 的文字資料,或假如轉換失敗的話,傳回 false


使用 iconv() 將 BIG5 編碼的繁體中文字轉換成 UTF-8 編碼通常是不會有什麼問題的 ...


但是,
假如換成是要將 UTF-8 萬國碼 中文字轉成 BIG5 碼,偶爾就會遇上「缺碼字」的問題,如下例︰

Code : * php *
<?php
$string 
iconv('UTF-8''BIG5'"歡迎光臨 INABA 依蒳貝 有機保養裝園");
echo 
$string;
// 以上程式範例將會輸出以下BIG5編碼文字 ...
// 歡迎光臨 INABA 依
?>
上例︰輸出結果,從 [蒳] 這個字開始包括以後的東西都不見啦!

這怎麼回事 ?!

因為,
許多在電腦上可以打出來的中文字,如上例的「蒳」 <<-- 這個字 實際上繁體中文BIG5碼裏頭並無此字型。

UTF-8 碼所包含的中文字比 BIG5 碼多出很多;有很多UTF-8 編碼所包含中文字,其實 BIG5 碼裏面並沒有。

所以當我們使用 iconv() 將 UTF-8 轉換為 BIG5,其中假如有 BIG5 碼裏所沒有的字,該函式的轉碼動作將會停止,並產生一個提示警訊。

 提示警訊... Notice: iconv() [function.iconv]: Detected an illegal character in input string in ...... scriptfilename.php on line (num)
註 : PHP 預設不會顯示這類 Notice (提示警訊),除非主機變更設定,或程式中以 error_report(E_ALL) 指定顯示所有的錯誤訊息。

那,怎麼辦?

iconv() 函式本身有提供幾個(不是怎麼理想的)處理方法 ...

1. 忽略BIG5缺碼字(跳過,不轉碼也,不以任何替代字顯示);

Code : * php *
$string iconv('UTF-8''BIG5//IGNORE'"歡迎光臨 INABA 依蒳貝 有機保養裝園");
echo 
$string;
// 以上程式範例將會輸出以下BIG5編碼文字 ...
// 歡迎光臨 INABA 依貝 有機保養裝園
上例︰缺碼字 [蒳] 直接被忽略過。

2. 嘗試以替代字元顯示,若無替代字可顯示,轉碼動作即停止,並產生提示警訊(此法不適用來轉中文字碼; 因為總是無可替換的字);

Code : * php *
$string iconv('UTF-8''BIG5//TRANSLIT'"歡迎光臨 INABA 依蒳貝 有機保養裝園");
echo 
$string;
// 以上程式範例將會輸出以下BIG5編碼文字 ...
// 歡迎光臨 INABA 依
上例︰遇缺碼字 [蒳] <-- 也無替代字可顯示... 即停止轉碼。

假如 缺碼字 有可替代顯示的字 ... 例 ...
Code : * php *
$string iconv('UTF-8''BIG5//TRANSLIT'"€100 == 歐幣100元");
echo 
$string;
// 以上程式範例將會輸出以下BIG5編碼文字 ...
// EUR100 == 歐幣100元
上例︰UTF-8 碼的歐元符號 € 嘗試轉成 BIG5 碼中文字符,但是 BIG5碼並無歐元符號(缺碼),於是以替代字 EUR 顯示。

3. 嘗試以替代字元顯示,若無可替代字則忽略跳過(不會產生提示警訊),繼續轉後面的文字。

Code : * php *
$string iconv('UTF-8''BIG5//TRANSLIT//IGNORE'"歡迎光臨 INABA 依蒳貝 有機保養裝園");
echo 
$string;
// 以上程式範例將會輸出以下BIG5編碼文字 ...
// 歡迎光臨 INABA 依貝 有機保養裝園
上例︰缺碼字 [蒳] <-- 也無替代字可顯示... 直接被忽略過。


//TRANSLIT
//IGNORE
//TRANSLIT//IGNORE

iconv() 提供在 目標編碼 後面加上以上三種選項標記文字的方式來處理 目標編碼 缺碼字 的問題。

從上述幾個程式範例看來,//TRANSLIT//IGNORE 是稍微比較理想 (仍然是不盡理想) 的方式。

這篇先寫到這裏。

後面再接續文來分別介紹兩種較理想的處理方法 -- 直接將缺碼字轉成 UnicodeHTML 碼,讓這些缺碼字 以 HTML(entities) 原始碼格式(例︰[&#33971;] 顯示為「」)直接顯示 Unicode 編碼字符 在網頁上 (無論網頁文字顯示是否使用Unicode/UTF-8編碼都行)。

arrow
arrow
    全站熱搜

    yoonow 發表在 痞客邦 留言(0) 人氣()