mb_check_encoding 對於中文的陷阱

mb_check_encoding,這是 php 提供的一個函數,用於判斷給訂的字串是否為指定的編碼模式。
但這東西,遇到了偉大的中文就會發生一些 好笑 詭異的情況發生了。而這些詭異的情況就會大大的考驗了身成程式工程師的能力。

我發現這樣的情況是在 系統上使用 utf-8 做為編碼模式,在某一個情況下瀏覽器 ( 對不起,我真的忘了當初這樣的特力是如何產生的 ) 卻會以 big5 的模式將文字內容傳送回來。所以我就在接收的時候使用了這樣的方式來確保回來的文字會是 utf-8 的模式,才不會寫入亂碼進入資料庫當中

if( mb_check_encoding($value, 'big5') ) {
	$value = mb_convert_encoding($value, 'utf-8', 'big5');
}

一開始的時候,一切都相安無事,直到有一天我在測試新功能的時候,用了一個簡短的文字來進行測試的時候,就發生了詭異的情況,因為 utf-8 的字串被誤判為 big5 的字串,而導致程是很自動將正常的文字轉換為一個無意義的文字。

而我用來測試的字串真的很簡單【測試】
沒錯,他會被誤判為 big5 的字串,而被轉換為【皜祈岫】
原因很簡單,當你將 utf-8 的【測試】轉換為 16 近位的編碼模式,你會得到 e6b8ace8a9a6 這樣的內容
因此在 utf-8 底下文字是被這樣對待的 e6b8ac e8a9a6 =
而無巧不巧的事情發生,在 big5 的模式下 e6b8 ace8 a9a6  =
也是成立的,所以他就會不小心的被當作是 big5 進而發生錯亂了

最後,這問題小弟暫時也沒有什麼好的解決方案,本篇文章的重點僅在於記錄這事情。
而同樣的問題,在編碼為 gbk ( 簡體中文 ) Shift-JIS (日文) 的時候也會發生