内容简介: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 的编码规则很简单,只有二条:
-
对于单字节的符号,字节的第一位设为
0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的(能容纳0~127)。 -
对于
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 |
想必看了这个表,大家就能明白了吧。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 字符串的长度,是字符数量,还是字节数量?
- 谈 Golang 中的字符串和字节数组
- Go语言之父带你重新认识字符串、字节、rune和字符
- [译] Go 语言之父带你重新认识字符串、字节、rune 和字符
- 如何使用Perl将48个十六进制字符串转换为字节?
- 主机字节序和网络字节序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Probability and Computing
Michael Mitzenmacher、Eli Upfal / Cambridge University Press / 2005-01-31 / USD 66.00
Assuming only an elementary background in discrete mathematics, this textbook is an excellent introduction to the probabilistic techniques and paradigms used in the development of probabilistic algori......一起来看看 《Probability and Computing》 这本书的介绍吧!