需求
如果需要将可能含有中文的字符串进行拆分成数组,我们下面以 utf-8 编码为例。
解决方案一
我习惯的方法可能是:
假如我们没装mb扩展怎么办?
解决方案二
今天看到一份代码,别人是这么写的:
代码解读
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/blog/2007/10/ascii_unicode_and_utf-8.html
https://segmentfault.com/a/1190000012692022
口语化叙述 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
想必看了这个表,大家就能明白了吧。
本文作者: chenishr
本文标题:《【转载】PHP 自定义切割多字节字符串》
©版权所有,除非注明,
永在路上文章均为原创,转载请以链接形式注明出处和作者细信息。