PHP編碼轉換函式 自動轉換字元集支援數群組轉換_PHP教程

來源:互聯網
上載者:User
複製代碼 代碼如下:
// 自動轉換字元集 支援數群組轉換
function auto_charset($fContents, $from='gbk', $to='utf-8') {
$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
$to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;
if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
//如果編碼相同或者非字串標量則不轉換
return $fContents;
}
if (is_string($fContents)) {
if (function_exists('mb_convert_encoding')) {
return mb_convert_encoding($fContents, $to, $from);
} elseif (function_exists('iconv')) {
return iconv($from, $to, $fContents);
} else {
return $fContents;
}
} elseif (is_array($fContents)) {
foreach ($fContents as $key => $val) {
$_key = auto_charset($key, $from, $to);
$fContents[$_key] = auto_charset($val, $from, $to);
if ($key != $_key)
unset($fContents[$key]);
}
return $fContents;
}
else {
return $fContents;
}
}

當我們在接受未知用戶端提交的資料,由於各用戶端的編碼不統一,但在我們的伺服器端最終只能以一種編碼方式來處理,這種情況下就會涉及到一個將接受到的字元轉換為特定編碼的問題。
這時可能會想到直接用iconv來進行轉碼,但我們知道,iconv這個函數需要提供的兩個參數為輸入編碼和輸出編碼,而我們現在根本不知道接受的字串是什麼編碼,如果這個時候能得到接收字元是什麼編碼就好了。
對於這樣的問題,一般會有兩種解決方案。

方案一
要用戶端提交資料時,指定所提交的編碼,這時就需要多給一個用來指定編碼的變數。
$string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
對於這種情況,如果在沒有約定或者我們不能控制用戶端的情況下,似乎這種方案使用不是很好。

方案二
直接由伺服器端來檢測所接收的資料編碼。
這種方案當然是最理想了的了,現在問題是怎麼檢測一個字元的編碼嗎?對於這種情況,在php裡,mb_string這個擴充中的mb_check_encoding提供了我們所需要的功能。
$str = mb_check_encoding($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
但這需要開啟mb_string這個擴充,有些時候可能我們的生產伺服器中沒有開啟這個擴充。對於這種情況,需要自己藉助如下函數來判斷編碼。
以下函數非本人所寫
複製代碼 代碼如下:
function isGb2312($string) {
for($i=0; $i 127) {
if( ($v >= 228) && ($v < = 233) )
{
if( ($i+2) >= (strlen($string) - 1)) return true;
$v1 = ord( $string[$i+1] );
$v2 = ord( $string[$i+2] );
if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 < = 191) )
return false;
else
return true;
}
}
}
return true;
}
function isUtf8($string) {
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}

這裡我們就可以使以上任何一個函數來實現編碼的檢測。並將其轉換成指定的編碼。
$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

http://www.bkjia.com/PHPjc/326216.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/326216.htmlTechArticle複製代碼 代碼如下: // 自動轉換字元集 支援數群組轉換 function auto_charset($fContents, $from='gbk', $to='utf-8') { $from = strtoupper($from) == 'UTF8' ? 'utf-8' :...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.