我来详细讲解下“完美的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编码函数分享
猜你喜欢
- PHP MVC框架中类的自动加载机制实例分析 2023-02-13
- Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例 2023-04-07
- PHP实现基于状态的责任链审批模式详解 2023-01-19
- PHP常用字符串函数用法实例总结 2023-04-20
- PHP实现文件上传和下载的示例代码 2023-06-26
- PHP生成腾讯云COS接口需要的请求签名 2022-10-18
- php和nginx交互实例讲解 2023-02-13
- PHP laravel使用自定义邮件类实现发送邮件 2023-07-03
- 详解PHP 二维数组排序保持键名不变 2022-12-30
- PHP实现微信申请退款功能 2022-11-23