完美的2个php检测字符串是否是utf-8编码函数分享

我来详细讲解下“完美的2个php检测字符串是否是utf-8编码函数分享”的完整攻略:

我来详细讲解下“完美的2个php检测字符串是否是utf-8编码函数分享”的完整攻略:

函数说明

这是一个有关于 UTF-8 编码判断的 PHP 函数,可用于判断一个字符串是否为 UTF-8 编码形式。此类编码判断函数的基本思路上,检查字符串的每个字符是否为 UTF-8 编码,并处理其对应的位数。

函数名:my_utf8_strlen

  • 参数:
string $str    待检测字符串
  • 返回值:
int           字符串长度
  • 说明:

在 UTF-8 编码方式下,每个字符占用 1~4 个字节不等。因此,判断字符串的长度时要特别注意。

函数名: my_utf8_check

  • 参数:
string $str    待检测字符串
  • 返回值:
bool          是否为 UTF-8 编码形式,true/false
  • 说明:

此函数判断字符串是否为 UTF-8 编码形式的方法,是通过逐个字符地验证,符合 UTF-8 编码规则的字符则累加通过的编码位数。如果都验证通过,则返回 true,否则返回 false。

代码实现

下面是完整的 PHP 代码实现:

<?php
/**
 * 判断字符串是否为 UTF-8 编码形式
 *
 * @param string $str 待检测字符串
 *
 * @return bool 是否为 UTF-8 编码形式,true/false
 */
function my_utf8_check($str)
{
    if (!preg_match("/^(?:[\x00-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf4][\x80-\xbf]{3})*$/", $str)) {
        return false;
    }
    $len = strlen($str);
    for($i = 0; $i < $len; ++$i) {
        $bit = ord($str[$i]);
        if(0 === ($bit & 0x80)) {             // 0xxx xxxx
            continue;
        } elseif(0xC0 === ($bit & 0xE0)) {    // 110x xxxx 10xx xxxx
            $n = ord($str[++$i]);
            if (0x80 !== ($n & 0xC0)) {
                return false;
            }
        } elseif (0xE0 === ($bit & 0xF0)) {   // 1110 xxxx 10xx xxxx 10xx xxxx
            $n = ord($str[++$i]);
            if (0x80 !== ($n & 0xC0) || 0x80 !== (ord($str[++$i]) & 0xC0)) {
                return false;
            }
        } elseif (0xF0 === ($bit & 0xF8)) {   // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
            $n = ord($str[++$i]);
            if (0x80 !== ($n & 0xC0) || 0x80 !== (ord($str[++$i]) & 0xC0) || 0x80 !== (ord($str[++$i]) & 0xC0)) {
                return false;
            }
        } else {                              // 10xx xxxx, 1111 10xx
            return false;
        }
    }
    return true;
}

/**
 * 计算字符串的长度
 *
 * @param string $str 待检测字符串
 *
 * @return int 字符串长度
 */
function my_utf8_strlen($str)
{
    $len = strlen($str);
    $counter = 0;
    for ($i = 0; $i < $len; ++$i) {
        $byte = ord($str[$i]);
        if (0 === ($byte & 0x80)) {             // 0xxx xxxx
            ++$counter;
        } elseif (0xC0 === ($byte & 0xE0)) {    // 110x xxxx 10xx xxxx
            ++$counter; ++$i;
        } elseif (0xE0 === ($byte & 0xF0)) {    // 1110 xxxx 10xx xxxx 10xx xxxx
            ++$counter; ++$i; ++$i;
        } elseif (0xF0 === ($byte & 0xF8)) {    // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
            ++$counter; ++$i; ++$i; ++$i;
        } else {                               // 10xx xxxx, 1111 10xx
            // 无此情况
        }
    }
    return $counter;
}

// examples
$str1 = "hello, world!";
if (my_utf8_check($str1)) {
    echo "$str1 是 UTF-8 编码\n";
} else {
    echo "$str1 不是 UTF-8 编码\n";
}
echo "字符串 '$str1' 的长度为:".my_utf8_strlen($str1)." 个字符\n";

echo "\n";

$str2 = "Hello, 你好!";
if (my_utf8_check($str2)) {
    echo "$str2 是 UTF-8 编码\n";
} else {
    echo "$str2 不是 UTF-8 编码\n";
}
echo "字符串 '$str2' 的长度为:".my_utf8_strlen($str2)." 个字符\n";

可以运行上面的代码,看到输出结果分别是:

hello, world! 是 UTF-8 编码
字符串 'hello, world!' 的长度为:13 个字符

Hello, 你好! 是 UTF-8 编码
字符串 'Hello, 你好!' 的长度为:10 个字符

经过测试,函数可以正确判断是否为 UTF-8 编码形式,并且可以正确计算 UTF-8 编码形式的字符串长度。

本文标题为:完美的2个php检测字符串是否是utf-8编码函数分享

基础教程推荐