若是须要将可能含有中文的字符串进行拆分红数组,咱们下面以 utf-8 编码为例。php
我习惯的方法多是:数组
mb_internal_encoding("UTF-8");
$str = "周梦康";
$array = [];
for ($i=0,$l = mb_strlen($str); $i < $l; $i++) {
array_push($array, mb_substr($str, $i, 1, "utf-8"));
}
var_export($array);
假如咱们没装mb
扩展怎么办?app
今天看到一份代码,别人是这么写的:学习
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码值。编码
Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。spa
UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。UTF-8 最大的一个特色,就是它是一种变长的编码方式。它可使用1~4个字节表示一个符号,根据不一样的符号而变化字节长度。3d
UTF-8 的编码规则很简单,只有二条:code
0
,后面7
位为这个符号的 Unicode 码。所以对于英语字母,UTF-8 编码和 ASCII 码是相同的(能容纳0~127)。n
字节的符号(n > 1),第一个字节的前n
位都设为1,第n + 1
位设为0,后面字节的前两位一概设为10
。剩下的没有说起的二进制位,所有为这个符号的 Unicode 码。下表总结了编码规则,字母x
表示可用编码的位:orm
想必看了这个表,你们就能明白了吧。blog
以上是文章所有内容,有须要学习交流的友人请加入交流群的我们一块儿,有问题一块儿交流,一块儿进步!前提是你是学技术的。感谢阅读!