close
使用 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),又稱「統一碼」或「萬國碼」。
要使用 PHP 將台灣繁體中文專用編碼 BIG5 或簡體中文GB2312/GBK碼 轉成UTF-8萬國碼,都是很容易的事。
在PHP中最常用來進行各種文字編碼之間的轉換函式應該就是 iconv()
在 PHP 裏的 iconv() 函式是由 libiconv library 提供;無論是在 台灣、香港、大陸,或美國 ... 目前絕大部份的主機商應該都有開放此函式庫給虛擬主機戶使用;假如是自架主機,就要確定當初安裝編譯PHP時有 --with-iconv[=DIR] 方能支援此轉碼用函式庫。
使用 iconv() 將 BIG5 編碼的繁體中文字轉換成 UTF-8 編碼通常是不會有什麼問題的 ...
但是,
假如換成是要將 UTF-8 萬國碼 中文字轉成 BIG5 碼,偶爾就會遇上「缺碼字」的問題,如下例︰
Code : * php *
上例︰輸出結果,從 [蒳] 這個字開始包括以後的東西都不見啦!
這怎麼回事 ?!
因為,
許多在電腦上可以打出來的中文字,如上例的「蒳」 <<-- 這個字 實際上繁體中文BIG5碼裏頭並無此字型。
UTF-8 碼所包含的中文字比 BIG5 碼多出很多;有很多UTF-8 編碼所包含中文字,其實 BIG5 碼裏面並沒有。
所以當我們使用 iconv() 將 UTF-8 轉換為 BIG5,其中假如有 BIG5 碼裏所沒有的字,該函式的轉碼動作將會停止,並產生一個提示警訊。
註 : PHP 預設不會顯示這類 Notice (提示警訊),除非主機變更設定,或程式中以 error_report(E_ALL) 指定顯示所有的錯誤訊息。
那,怎麼辦?
iconv() 函式本身有提供幾個(不是怎麼理想的)處理方法 ...
1. 忽略BIG5缺碼字(跳過,不轉碼也,不以任何替代字顯示);
Code : * php *
上例︰缺碼字 [蒳] 直接被忽略過。
2. 嘗試以替代字元顯示,若無替代字可顯示,轉碼動作即停止,並產生提示警訊(此法不適用來轉中文字碼; 因為總是無可替換的字);
Code : * php *
上例︰遇缺碼字 [蒳] <-- 也無替代字可顯示... 即停止轉碼。
假如 缺碼字 有可替代顯示的字 ... 例 ...
Code : * php *
上例︰UTF-8 碼的歐元符號 € 嘗試轉成 BIG5 碼中文字符,但是 BIG5碼並無歐元符號(缺碼),於是以替代字 EUR 顯示。
3. 嘗試以替代字元顯示,若無可替代字則忽略跳過(不會產生提示警訊),繼續轉後面的文字。
Code : * php *
上例︰缺碼字 [蒳] <-- 也無替代字可顯示... 直接被忽略過。
//TRANSLIT
//IGNORE
//TRANSLIT//IGNORE
iconv() 提供在 目標編碼 後面加上以上三種選項標記文字的方式來處理 目標編碼 缺碼字 的問題。
從上述幾個程式範例看來,//TRANSLIT//IGNORE 是稍微比較理想 (仍然是不盡理想) 的方式。
這篇先寫到這裏。
後面再接續文來分別介紹兩種較理想的處理方法 -- 直接將缺碼字轉成 UnicodeHTML 碼,讓這些缺碼字 以 HTML(entities) 原始碼格式(例︰[蒳] 顯示為「蒳」)直接顯示 Unicode 編碼字符 在網頁上 (無論網頁文字顯示是否使用Unicode/UTF-8編碼都行)。
UTF-8 編碼 (Unicode),又稱「統一碼」或「萬國碼」。
要使用 PHP 將台灣繁體中文專用編碼 BIG5 或簡體中文GB2312/GBK碼 轉成UTF-8萬國碼,都是很容易的事。
在PHP中最常用來進行各種文字編碼之間的轉換函式應該就是 iconv()
在 PHP 裏的 iconv() 函式是由 libiconv library 提供;無論是在 台灣、香港、大陸,或美國 ... 目前絕大部份的主機商應該都有開放此函式庫給虛擬主機戶使用;假如是自架主機,就要確定當初安裝編譯PHP時有 --with-iconv[=DIR] 方能支援此轉碼用函式庫。
使用 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 碼裏所沒有的字,該函式的轉碼動作將會停止,並產生一個提示警訊。
註 : 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元
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) 原始碼格式(例︰[蒳] 顯示為「蒳」)直接顯示 Unicode 編碼字符 在網頁上 (無論網頁文字顯示是否使用Unicode/UTF-8編碼都行)。
全站熱搜
留言列表