原文請關注個人博客 https://mengkang.net/1129.html
不少工程師在工做1~3年的時候最容易遇到瓶頸,不知道本身應該學習什麼,面試老是吃閉門羹。那麼 PHP 後面應該怎麼學呢? 安利一波個人系列直播 PHP 進階之路
若是須要將可能含有中文的字符串進行拆分紅數組,咱們下面以 utf-8 編碼爲例。php
我習慣的方法多是:html
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
擴展怎麼辦?面試
今天看到一份代碼,別人是這麼寫的:segmentfault
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 只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。學習
UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。UTF-8 最大的一個特色,就是它是一種變長的編碼方式。它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度。編碼
UTF-8 的編碼規則很簡單,只有二條:.net
0
,後面7
位爲這個符號的 Unicode 碼。所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的(能容納0~127)。n
字節的符號(n > 1),第一個字節的前n
位都設爲1,第n + 1
位設爲0,後面字節的前兩位一概設爲10
。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。下表總結了編碼規則,字母x
表示可用編碼的位:code
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 |
想必看了這個表,你們就能明白了吧。htm