完美的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删除数组指定元素的实现方法 1. 使用unset函数删除数组指定元素 在php中,我们可以使用unset函数来删除数组中的指定元素。unset函数可以接受一个或多个参数,每个参数可以是字符串、变量名或数组元素。若参数是一个数组元素,那么该元素会被删除掉。 以下是使用unset函数…

    PHP 2023年5月26日
    00
  • 具有时效性的php加密解密函数代码

    具有时效性的PHP加密解密函数代码可以保护我们的敏感数据不被恶意篡改和窃取。下面我来详细讲解一下实现这一功能的攻略。 确定加密解密算法 首先需要确定加密解密算法,常见的有DES、AES、RSA等多种算法。在此我以AES算法为例进行说明。 生成密钥 使用AES加密算法需要一个密钥来进行加密和解密操作,可以使用安全随机数生成函数生成一个随机的密钥。示例代码如下:…

    PHP 2023年5月26日
    00
  • Fleaphp常见函数功能与用法示例

    当谈到Fleaphp时,它是一个基于PHP的轻量级Web框架,开发者可以使用该框架实现快速开发和高效的Web应用程序。在Fleaphp提供的各种函数中,有许多常见的函数,这些函数可以帮助开发者快速实现基本的Web应用程序,以及提高应用程序的性能和可靠性。 Fleaphp常见函数功能与用法示例 控制器类函数 $this->input->get($n…

    PHP 2023年5月25日
    00
  • php的array_multisort()使用方法介绍

    下面我来详细讲解“php的array_multisort()使用方法介绍”的完整攻略。 什么是array_multisort()函数? array_multisort()函数是PHP中用于对多个数组或者多维数组进行排序的函数。它可以同时对多个数组进行排序,或者对多维数组按照指定规则进行排序。 array_multisort()函数的语法 array_mult…

    PHP 2023年5月26日
    00
  • 用windows自带的ftp.exe实现断点续传的方法

    使用Windows自带的ftp.exe实现断点续传的方法,可以通过以下步骤实现: 1. 开启FTP服务端和连接服务器 在本地开启FTP服务端,比如使用FileZilla Server软件,将文件上传到服务器。 在本地打开cmd终端,输入以下命令连接FTP服务器: ftp IP地址或域名 然后输入FTP服务器的用户名和密码进行登录。 2. 开启二进制模式和断点…

    PHP 2023年5月27日
    00
  • php 数学运算验证码实现代码

    下面是“php 数学运算验证码实现代码”的完整攻略。 1. 确定验证码生成的规则 在实现数学运算验证码时,需要确定验证码的生成规则。一般情况下,数学运算验证码是由加减乘除四种运算符构成的简单算术题目,例如:6+2=?、4-1=?等等。确定好规则之后,可以使用PHP中的rand()函数生成随机的两个运算数和一个运算符,然后将其赋值给验证码。 2. 编写生成验证…

    PHP 2023年5月26日
    00
  • PHP单例模式详解及实例代码

    下面我将为你详细讲解PHP单例模式及其实现方式。 1. 什么是单例模式 单例模式是一种常用的设计模式,它的目的是保证一个类只有一个实例,同时提供一个全局访问该实例的入口。在实际开发中,当一个类的实例化过程非常耗时或者实例化多次会造成资源浪费时,就可以使用单例模式来解决这个问题。 2. 单例模式的实现方式 单例模式的实现方式一般分为两种:懒汉式和饿汉式。 2.…

    PHP 2023年5月23日
    00
  • 用PHP和MySQL保存和输出图片

    使用PHP和MySQL保存和输出图片的完整攻略包括以下步骤: 创建数据库表:首先需要创建一个用来保存图片的数据库表。表中应该包含两个列,一个是用来保存图片的二进制数据的列,另一个是用来指定图片类型的列,常用的图片类型包括JPEG、PNG和GIF。 示例代码: CREATE TABLE `images` ( `id` int(11) NOT NULL AUTO…

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