色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

PHP編碼轉(zhuǎn)換函數(shù) 自動(dòng)轉(zhuǎn)換字符集支持?jǐn)?shù)組轉(zhuǎn)換

復(fù)制代碼 代碼如下:
// 自動(dòng)轉(zhuǎn)換字符集 支持?jǐn)?shù)組轉(zhuǎn)換
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))) {
//如果編碼相同或者非字符串標(biāo)量則不轉(zhuǎn)換
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;
}
}

當(dāng)我們?cè)诮邮芪粗蛻舳颂峤坏臄?shù)據(jù),由于各客戶端的編碼不統(tǒng)一,但在我們的服務(wù)器端最終只能以一種編碼方式來(lái)處理,這種情況下就會(huì)涉及到一個(gè)將接受到的字符轉(zhuǎn)換為特定編碼的問(wèn)題。
這時(shí)可能會(huì)想到直接用iconv來(lái)進(jìn)行轉(zhuǎn)碼,但我們知道,iconv這個(gè)函數(shù)需要提供的兩個(gè)參數(shù)為輸入編碼和輸出編碼,而我們現(xiàn)在根本不知道接受的字符串是什么編碼,如果這個(gè)時(shí)候能得到接收字符是什么編碼就好了。
對(duì)于這樣的問(wèn)題,一般會(huì)有兩種解決方案。

方案一
要客戶端提交數(shù)據(jù)時(shí),指定所提交的編碼,這時(shí)就需要多給一個(gè)用來(lái)指定編碼的變量。
$string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
對(duì)于這種情況,如果在沒(méi)有約定或者我們不能控制客戶端的情況下,似乎這種方案使用不是很好。

方案二
直接由服務(wù)器端來(lái)檢測(cè)所接收的數(shù)據(jù)編碼。
這種方案當(dāng)然是最理想了的了,現(xiàn)在問(wèn)題是怎么檢測(cè)一個(gè)字符的編碼嗎?對(duì)于這種情況,在php里,mb_string這個(gè)擴(kuò)展中的mb_check_encoding提供了我們所需要的功能。
$str = mb_check_encoding($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
但這需要打開(kāi)mb_string這個(gè)擴(kuò)展,有些時(shí)候可能我們的生產(chǎn)服務(wù)器中沒(méi)有打開(kāi)這個(gè)擴(kuò)展。對(duì)于這種情況,需要自己借助如下函數(shù)來(lái)判斷編碼。
以下函數(shù)非本人所寫(xiě)
復(fù)制代碼 代碼如下:
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);
}

這里我們就可以使以上任何一個(gè)函數(shù)來(lái)實(shí)現(xiàn)編碼的檢測(cè)。并將其轉(zhuǎn)換成指定的編碼。
$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];

php技術(shù)PHP編碼轉(zhuǎn)換函數(shù) 自動(dòng)轉(zhuǎn)換字符集支持?jǐn)?shù)組轉(zhuǎn)換,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 巴东县| 海宁市| 宣武区| 新津县| 温州市| 洛阳市| 桃江县| 兰坪| 临清市| 万安县| 樟树市| 手游| 临清市| 隆子县| 永丰县| 石棉县| 昌宁县| 搜索| 阿拉善右旗| 石阡县| 广饶县| 定陶县| 封丘县| 隆昌县| 桐城市| 宣城市| 贵港市| 安义县| 丰镇市| 兰州市| 三台县| 调兵山市| 福清市| 呼图壁县| 沁水县| 阳新县| 盐津县| 泉州市| 禹州市| 新蔡县| 临潭县|