在PHP處理頁面的時候,我們對於字元集的轉換都是採用了iconv或者mb_convert等函數,但,這其實是有一個前提的。即我們事先得知道in和out是什麼樣的編碼,我們才能進行正確的轉換。
下面這個函數,就可以在不知道源字串編碼的情況下,自動判斷其編碼並進行轉換。雖然只支援UTF8編碼和GB2312編碼,但對於國內絕大多數網站來說,已經夠用了。
代碼如下 |
複製代碼 |
function safeEncoding($string,$outEncoding = 'UTF-8') { $encoding = "UTF-8"; for($i=0;$i<128) continue;
if((ord($string{$i})&224)==224) { //第一個位元組判斷通過 $char = $string{++$i}; if((ord($char)&128)==128) { //第二個位元組判斷通過 $char = $string{++$i}; if((ord($char)&128)==128) { $encoding = "UTF-8"; break; } } } if((ord($string{$i})&192)==192) { //第一個位元組判斷通過 $char = $string{++$i}; if((ord($char)&128)==128) { //第二個位元組判斷通過 $encoding = "GB2312"; break; } } } if(strtoupper($encoding) == strtoupper($outEncoding)) return $string; else return iconv($encoding,$outEncoding,$string); } |
例2
代碼如下 |
複製代碼 |
//識別漢字編碼,因為YBlog用的是utf-8,如果引用發過來的是gb2312的編碼的話,需要可以識別並完成編碼轉換 function safeEncoding($string,$outEncoding = 'UTF-8') { $encoding = "UTF-8"; for($i=0;$i<strlen($string);$i++) { if(ord($string{$i})<128) continue; if((ord($string{$i})&224)==224) { //第一個位元組判斷通過 $char = $string{++$i}; if((ord($char)&128)==128) { //第二個位元組判斷通過 $char = $string{++$i}; if((ord($char)&128)==128) { $encoding = "UTF-8"; break; } } } if((ord($string{$i})&192)==192) { //第一個位元組判斷通過 $char = $string{++$i}; if((ord($char)&128)==128) { //第二個位元組判斷通過 $encoding = "GB2312"; break; } } } if(strtoupper($encoding) == strtoupper($outEncoding)) return $string; else return iconv($encoding,$outEncoding,$string); }
|