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

yizhihongxing

我来详细讲解下“完美的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编写出实现不同促销活动的函数; 然后,在网站…

    PHP 2023年5月23日
    00
  • PHP 并发方案建议

    1,消息队列解决方案: RabbitMQ:RabbitMQ 是一个开源的 AMQP 消息中间件,提供了高可用、高并发、高吞吐量的消息队列服务。使用 PHP 语言可以通过 AMQP 扩展连接到 RabbitMQ 服务,实现消息的生产、消费和处理。 Redis 队列:Redis 是一个开源的内存数据库,提供了高速、高性能的数据结构服务,如字符串、列表、集合、哈希…

    PHP 2023年4月18日
    00
  • PHP木马大全 一句话的PHP木马的防范

    对于“PHP木马大全 一句话的PHP木马的防范”,我们可以采取以下策略来进行防范: 什么是PHP木马 在了解如何防范一句话的PHP木马之前,我们需要先了解什么是PHP木马。简单来说,PHP木马就是利用PHP语言所编写的恶意脚本,在服务器上进行隐藏式攻击和控制,以达到攻击目的的一种手段。 一句话的PHP木马 一句话的PHP木马是最常见的一种PHP木马,其本质是…

    PHP 2023年5月23日
    00
  • php简单读取.vcf格式文件的方法示例

    下面是使用PHP简单读取.vcf格式文件的方法示例的完整攻略。 什么是.vcf格式文件 .vcf 格式,全称为“vCard”格式,是一种电子名片标准格式,其文件内容按照特定的结构存储,以便携带人员联系信息。 读取.vcf格式文件的方法 使用 PHP 读取 .vcf 格式文件是一项相对简单的任务。可以使用以下步骤: 打开.vcf 格式文件 读取文件内容 解析.…

    PHP 2023年5月26日
    00
  • php使用preg_match()函数验证ip地址的方法

    现在我们来详细讲解如何使用 PHP 的 preg_match() 函数验证 IP 地址。 什么是 preg_match() 函数 preg_match() 函数是 PHP 中一个强大的正则匹配函数,它可以用来匹配一个正则表达式,并返回一个布尔值,表示该正则表达式是否匹配成功了。该函数的语法如下: preg_match ( string $pattern , …

    PHP 2023年5月26日
    00
  • php循环创建目录示例分享(php创建多级目录)

    以下是 “php循环创建目录示例分享(php创建多级目录)” 的完整攻略: 1. 题目背景 在开发网站时经常需要创建多个级别的文件夹,以保存图片、文本等文件,因此,通过 PHP 程序快速创建多级文件夹是一个常见需求。 2. 实现方法 2.1. 使用 mkdir() 函数 PHP 中提供了 mkdir() 函数,用于创建文件夹,语法如下: bool mkdir…

    PHP 2023年5月23日
    00
  • php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析

    PHP截取字符串函数substr, iconv_substr, mb_substr示例以及优劣分析 在PHP开发中,截取一个字符串是一项常见的操作。PHP提供了几种截取字符串的函数,如substr, iconv_substr和mb_substr。我们可以使用这些函数来截取字符串,并可以根据实际情况选择最合适的函数。 substr substr()函数是PHP…

    PHP 2023年5月26日
    00
  • PHP实现下载远程图片保存到本地的方法

    实现下载远程图片保存到本地的方法,可以采用PHP的curl库来实现。具体步骤如下: 步骤一:开启curl扩展 在PHP中使用curl库,需要开启curl扩展。如果你的PHP环境中没有安装curl扩展,可以在php.ini配置文件中添加如下配置: extension=curl.so (Linux) extension=curl.dll (Windows) 步骤…

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