完美的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编码函数分享 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php实现字符串反转输出的方法

    下面是详细讲解PHP实现字符串反转输出的方法的完整攻略。 标准解法 在PHP中,我们可以用内置函数 strrev() 来实现字符串的反转。 $str = "Hello World!"; $reversedStr = strrev($str); echo $reversedStr; // 输出 "!dlroW olleH&quot…

    PHP 2023年5月26日
    00
  • IIS 6 的 PHP 最佳配置方法

    下面是 “IIS 6 的 PHP 最佳配置方法” 的完整攻略: 一、安装 PHP 首先,需要从 PHP 官方网站下载 PHP 的 Windows 版本,选择对应的线程(32位或64位)和版本号进行下载。下载完成后,解压到指定的目录,并配置环境变量。 二、安装 IIS 6 ISAPI 扩展 打开 IIS 管理器,右键单击“计算机名称”或“站点”节点,选择“属性…

    PHP 2023年5月24日
    00
  • php中curl和soap方式请求服务超时问题的解决

    下面是php中curl和soap方式请求服务超时问题的解决攻略。 1. 背景及问题 在PHP中,我们经常会使用curl和soap方式请求外部服务,但是有时候会遇到超时问题,导致请求失败无法得到正确结果。出现超时问题的原因可能有多种,比如: 服务器响应较慢或者网络情况不佳; 请求数据太大,耗时过长; 目标服务器过载等。 在这种情况下,我们需要对curl和soa…

    PHP 2023年5月27日
    00
  • php字符串截取函数用法分析

    PHP字符串截取函数用法分析 介绍 在PHP中,我们经常需要截取字符串,常用方法有两种:使用substr函数和使用正则表达式。本篇文章重点介绍substr函数的用法。 substr函数用法 在PHP中,substr函数用于截取字符串,其基本用法如下: substr(string $string, int $start, ?int $length = null…

    PHP 2023年5月25日
    00
  • PHP合并数组+与array_merge的区别分析

    PHP中合并数组有两种方式:使用+运算符和使用array_merge函数。这两种方式虽然都可以用于数组合并,但它们有一些重要的区别,下面我们就来详细讲解。 使用+运算符合并数组 使用+运算符可以将两个数组合并成一个新的数组,其中的键名为可用的整数或字符串,但如果两个数组中有相同的键名,那么后面的数组将覆盖前面的数组。 示例1: $array1 = array…

    PHP 2023年5月26日
    00
  • destoon找回管理员密码的方法

    destoon找回管理员密码的方法 作为一个网站管理员,如果忘记了自己的系统管理员密码,可以通过以下步骤找回。 第一步:进入destoon后台登录页面 在网站的前台或后台页面,找到可以进入后台的入口,输入您的用户名和错误的密码,H5 页面会展示:密码错误剩余 5 次,请谨慎操作。 如果您忘记了管理员用户名,可以通过查看数据库来找到。 第二步:找回密码入口 在…

    PHP 2023年5月24日
    00
  • php数组总结篇(一)

    让我为你详细解释一下“PHP数组总结篇(一)”这篇攻略。 PHP数组总结篇(一) 什么是数组? 数组是一种用于存储多个值的数据结构。这些值可以是不同类型的数据,例如字符串、整数和布尔值等。数组用于将多个相关的值组合在一起,使其更容易访问和处理。 声明数组 在 PHP 中,我们可以使用 array() 函数来声明一个数组。可以在括号中指定数组的元素。 //声明…

    PHP 2023年5月23日
    00
  • PHP如何实现HTTP验证

    HTTP验证,也称为基本身份验证(Basic Authentication),是一种常见的网站访问控制方法,它可以让你限制某些页面和资源只有在用户提供正确的用户名和密码时才能访问。在PHP中,可以通过以下步骤来实现HTTP验证。 1. 设置HTTP头 首先,需要设置HTTP头部,以让浏览器弹出身份验证对话框。可以使用PHP的header函数来设置HTTP头:…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部