PHP 高级面试题 - 如果没有 mb 系列函数,如何切割多字节字符串

栏目: PHP · 发布时间: 6年前

内容简介:PHP 高级面试题 - 如果没有 mb 系列函数,如何切割多字节字符串

原文请关注我的博客 https://mengkang.net/1129.html

初中级 phper 有多久没给自己充电了呢? 安利一波我的直播 PHP 进阶之路

需求

如果需要将可能含有中文的字符串进行拆分成数组,我们下面以 utf-8 编码为例。

解决方案一

我习惯的方法可能是:

$str = "周梦康";

$array = [];
for ($i=0,$l = mb_strlen($str,"utf-8"); $i < $l; $i++) { 
    array_push($array, mb_substr($str, $i, 1));
}

var_export($array);

假如我们没装 mb 扩展怎么办?

解决方案二

今天看到一份代码,别人是这么写的:

function str_split_utf8($str)  
{  
    $split = 1;  
    $array = array();  
    for ($i = 0; $i < strlen($str);) {  
        $value = ord($str[$i]);  
        if ($value > 127) {  
            if ($value >= 192 && $value <= 223) {  
                $split = 2;  
            } elseif ($value >= 224 && $value <= 239) {  
                $split = 3;  
            } elseif ($value >= 240 && $value <= 247) {  
                $split = 4;  
            }  
        } else {  
            $split = 1;  
        }  
        $key = null;  
        for ($j = 0; $j < $split; $j++, $i++) {  
            $key .= $str[$i];  
        }  
        array_push($array, $key);  
    }  
    return $array;  
}

代码解读

strlen 计算的是字节数,而直接使用 $str[x] 就沿用了 c语言 里面char数组和字符串的习惯,表示按字节来读取 $str ,也就是说每次读取的数据的ascii码值不可能大于255。而 php 里使用 ord 来获取ascii码值。

切割规则如下

ascii 码范围 切割偏移量
0 ~ 127 1 字节
192 ~ 223 2 字节
224 ~ 239 3 字节
240 ~ 247 4 字节

为什么呢?

http://www.ruanyifeng.com/blo...

https://segmentfault.com/a/11... 口语化叙述 utf-8 的来历

Unicode

Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

UTF-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

  1. 对于单字节的符号,字节的第一位设为 0 ,后面 7 位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的(能容纳0~127)。
  2. 对于 n 字节的符号(n > 1),第一个字节的前 n 位都设为1,第 n + 1 位设为0,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

下表总结了编码规则,字母 x 表示可用编码的位:

Unicode 符号范围(十六进制) UTF-8 编码方式(二进制) UTF-8 首字节范围
0000 0000-0000 007F 0xxxxxxx 0 ~ 127
0000 0080-0000 07FF 110xxxxx 10xxxxxx (128+64) ~ (255-32) 也就是 192 ~ 223
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx (128+64+32) ~ (255-16) 也就是 224 ~ 239
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (128+64+32+16) ~ (255-8) 也就是 240 ~ 247

想必看了这个表,大家就能明白了吧。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

O2O

O2O

张波 / 机械工业出版社华章公司 / 2013-2-5 / 49.00元

2012年是O2O元年,无论是成熟的传统企业、如火如荼的电子商务企业,还是以电信、银行、娱乐等为代表的与民生相关的企业,都在探索和践行O2O模式,因为O2O中孕育着极富创新性的商业模式。本书是国内首部O2O方面的著作,不仅宏观上叙述了O2O的概念、在各行业的应用情况,以及未来的发展趋势,而且还系统阐述和解读了各行业如何借助O2O来顺利实现商业模式的转型和升级;不仅极富洞察力地分析了O2O在营销、支......一起来看看 《O2O》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具