我来详细讲解下“完美的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编码函数分享 - Python技术站