欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PHP判断字符串编码是否utf8并转换的方法

shiping1 的头像
下面是苏州人的代码 判断是否是 utf-8的编码
<?php

function detectEncode($str)
{
    if(isUtf8($str))return "UTF-8";
    return "GBK";
}

function isUtf8($str)
{
  $score =   utf8_probability($str);
  if($score>90)return true;
  return 0;
}

function utf8_probability($rawtextstr) {
$score = 0;
$i = 0;
$rawtextlen = 0;
$goodbytes = 0;
$asciibytes = 0;
$rawtextarray = preg_split("//",$rawtextstr,-1, PREG_SPLIT_NO_EMPTY); //转换成char数组,如果是php5,则可使用str_split
$rawtext = array();
//var_dump($rawtextarray);die;
for($i=0;$i<count($rawtextarray);$i++)
$rawtext[] = ord($rawtextarray[$i]); //ord(char)
// Maybe also use UTF8 Byte Order Mark(BOM): EF BB BF
//BOM,某些utf8文件流的首3个字节,可以表示这个文件的编码方式
// Check to see if characters fit into acceptable ranges
//print_r($rawtext);
$rawtextlen = strlen($rawtextstr);
for ($i = 0; $i < $rawtextlen; $i++) {
if ($rawtext[$i] < 0x80) { // One byte
    $asciibytes++; // Ignore ASCII, can throw off count
} else if (0xC0 <= $rawtext[$i] && $rawtext[$i] <= 0xDF && // Two bytes
$i+1 < $rawtextlen && 0x80 <= $rawtext[$i+1] && $rawtext[$i+1] <= 0xBF) {
$goodbytes += 2; $i++;
} else if (0xE0 <= $rawtext[$i] && $rawtext[$i] <= 0xEF && // Three bytes
$i+2 < $rawtextlen && 0x80 <= $rawtext[$i+1] && $rawtext[$i+1] <= 0xBF &&
0x80 <= $rawtext[$i+2] && $rawtext[$i+2] <= 0xBF) {
$goodbytes += 3; $i+=2;
}
//if you want check just a few ,you may stop here with a score make.
//or you will be delayed when you meet lots of big files.
}
//ascii is sub of utf8
if ($asciibytes == $rawtextlen) { return 0; }
$score = (int)(100 * ($goodbytes/($rawtextlen-$asciibytes)));
// If not above 98, reduce to zero to prevent coincidental matches
if ($score > 98) {
return $score;
} else if ($score > 95 && $goodbytes > 30) {
// Allows for some (few) bad formed sequences
return $score;
} else {
return 0;
}
}
?>

PHP判断字符串编码是否utf8并转换的方法

关于PHP下字符串乱码的问题,当一个页面存在两种编码的时候,无论你乍么选择都会出现乱码,那么如何才能解决这个问题呢?烈火小编给大家提供的办法:

一。首先按国际惯例,检查你的文件编码与数据库、页面编码是否一致。

二。如果“一”没有问题,那么就需要先判断字符串的编码了,我们只要判断一种就可以了,关于检测是否为utf8编码的问题,烈火网以前发表过相关文章,但是不太好用,今天在网上找到一个比较完美的函数,代码如下:

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
function is_utf8($liehuo_net) 
{ 
if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$liehuo_net) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$liehuo_net) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$liehuo_net) == true) 
{ 
return true; 
} 
else 
{ 
return false; 
} 

}

现在再来说一下使用方法,高手就不用看了,因为一些初学者不懂得如何引入并使用这个函数,下边是方法。

一。将以上代码保存为独立文件,例如:liehuo_func_validt.php,保存到网站根目录,然后再引入到文件中,加入以下代码:

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
require( "liehuo_func_validt.php" );

接下来判断代码,写在上述代码的下边:

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
if(is_utf8($liehuo)==1) 
{ 
$liehuo = iconv("utf-8","gbk",$liehuo); 
}

这样就可以了。

二。将判断函数直接放在文件的顶部使用,再加入判断代码,比较啰嗦了,哈哈。多关注烈火网,支持Liehuo.Net哦。
来自 http://www.veryhuo.com/a/view/30414.html

普通分类: