需求
如果需要將可能含有中文的字串進行拆分成陣列,我們下面以 utf-8 編碼為例,
解決方案一
我習慣的方法可能是:
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擴展怎么辦?
解決方案二
今天看到一份代碼,別人是這么寫的:
function str_split_utf8($str)
{
$split = 1;
$array = array();
for ($i = 0; $i < strlen($str);) {
$value = https://www.cnblogs.com/heyue0117/p/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
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表示可用編碼的位:

想必看了這個表,大家就能明白了吧,
以上是文章全部內容,有需要學習交流的友人請加入交流群的咱們一起,有問題一起交流,一起進步!前提是你是學技術的,感謝閱讀!
點此加入該群
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103763.html
標籤:PHP
