最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
php下mb_detect_encoding函数检测字符串是否是utf-8编码
时间:2022-06-24 19:50:00 编辑:袖梨 来源:一聚教程网
在php中可以用mb_detect_encoding()()函数来判断一个字符串是否为某种编码,具体使用方法和注意事项如下:
需要注意的是,要使用mb_detect_encoding函数,必须开启php中的mbstring扩展(打开php.ini配置,重启服务即可)。
判断方式如下所示:
if( mb_detect_encoding($str, 'UTF-8', true) )
{
//是UTF-8格式的字符
}
网上有些人说这个函数判断不太准备,其实大致还是没问题的。
例子,利用mb_detect_encoding()判断字符是否为uft-8编码。
$encode = mb_detect_encoding($q, array('GB2312','GBK','UTF-8'));
echo $encode."
";
if($encode=="GB2312")
{
$q = iconv("GBK","UTF-8",$q);
}
else if($encode=="GBK")
{
$q = iconv("GBK","UTF-8",$q);
}
else if($encode=="EUC-CN")
{
$q = iconv("GBK","UTF-8",$q);
}
else//CP936
{
//$q = iconv("GB2312","UTF-8",$q);
}
可是 mb_detect_encoding 存在一个硬伤,经常出现判断不准确的情况。或许这样就可以解决:
// 使用 iconv 转换并判断是否等值,效率不高
function is_utf8 ($str) {
if ($str === iconv('UTF-8', 'UTF-8//IGNORE', $str)) {
return 'UTF-8';
}
}
// 多种编码的情况
function detect_encoding ($str) {
foreach (array('GBK', 'UTF-8') as $v) {
if ($str === iconv($v, $v . '//IGNORE', $str)) {
return $v;
}
}
}
通过以上方式得到字符串编码信息后,就可以利用 iconv 或 mb_convert_encoding 来转换编码了
例子
/**
* 检测文件编码
* @param string $file 文件路径
* @return string|null 返回 编码名 或 null
*/
function detect_encoding($file) {
$list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
$str = file_get_contents($file);
foreach ($list as $item) {
$tmp = mb_convert_encoding($str, $item, $item);
if (md5($tmp) == md5($str)) {
return $item;
}
}
return null;
}
/**
* 自动解析编码读入文件
* @param string $file 文件路径
* @param string $charset 读取编码
* @return string 返回读取内容
*/
function auto_read($file, $charset='UTF-8') {
$list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
$str = file_get_contents($file);
foreach ($list as $item) {
$tmp = mb_convert_encoding($str, $item, $item);
if (md5($tmp) == md5($str)) {
return mb_convert_encoding($str, $charset, $item);
}
}
return "";
}
例子
我创建三个文件:text1.txt text2.txt text3.txt
分别以ASCII UTF-8 UNICODE 的编码方式保存
代码如下:
define ('UTF32_BIG_ENDIAN_BOM' , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define ('UTF16_BIG_ENDIAN_BOM' , chr(0xFE) . chr(0xFF));
define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define ('UTF8_BOM' , chr(0xEF) . chr(0xBB) . chr(0xBF));
function detect_utf_encoding($text) {
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
if ($first3 == UTF8_BOM) return 'UTF-8';
elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
}
function getFileEncoding($str){
$encoding=mb_detect_encoding($str);
if(empty($encoding)){
$encoding=detect_utf_encoding($str);
}
return $encoding;
}
$file = 'text1.txt';
echo getFileEncoding(file_get_contents($file)); // 输出ASCII
echo '
';
$file = 'text2.txt';
echo getFileEncoding(file_get_contents($file)); // 输出UTF-8
echo '
';
$file = 'text3.txt';
echo getFileEncoding(file_get_contents($file)); // 输出UTF-16LE
echo '
';
?>
注意:要把php.ini中 extension=php_mbstring.dll 前的;号去掉,重启apache就可以了。
相关文章
- 以闪亮之名店长体验流霞季怎么玩 缘溪临霞套装活动介绍 12-31
- 未定事件簿旧梦新生左然篇怎么玩 旧梦新生左然篇活动介绍 12-31
- 未定事件簿左然破浪远行怎么样 12-31
- 桃源深处有人家行医问诊怎么玩 12-31
- 恋与制作人跨年福利有哪些 恋与制作人跨年福利内容介绍 12-31
- 阴阳师协同对弈大乱斗怎么玩 阴阳师协同对弈大乱斗活动介绍 12-31