原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不 管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的bom信息。话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauYjM5cmbvlXZkVHavw1LcpDc0RHaiojIsJye.png)
<?php
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)
// 第二个字节判断通过
$encoding = "gb2312";
break;
}
if(strtoupper($encoding) == strtoupper($outencoding))
return $string;
else
return iconv($encoding,$outencoding,$string);
}
?>
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauYjM5cmbvlXZkVHavw1LcpDc0RHaiojIsJye.png)
/**
* 将未知编码的字符串转换为期望的编码(配置文件中设置的编码)
* @param unknown $str
* @param string $toencoding
* @return string
*/
function convertstr($str, $toencode = 'utf-8') {
$charsetlist = array('ascii', 'gbk', 'gb2312', 'utf-8', 'big5');
$strcode = mb_detect_encoding($str, $charsetlist);
if (strtolower($strcode) != strtolower($toencode)) {
$str = iconv($strcode, $toencode, $str);
}
return $str;
}