摘要:它可以使用個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。對(duì)于字節(jié)的符號(hào),第一個(gè)字節(jié)的前位都設(shè)為,第位設(shè)為,后面字節(jié)的前兩位一律設(shè)為。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的碼。
原文請(qǐng)關(guān)注我的博客 https://mengkang.net/1129.html需求
很多工程師在工作1~3年的時(shí)候最容易遇到瓶頸,不知道自己應(yīng)該學(xué)習(xí)什么,面試總是吃閉門(mén)羹。那么 PHP 后面應(yīng)該怎么學(xué)呢?安利一波我的系列直播 PHP 進(jìn)階之路
如果需要將可能含有中文的字符串進(jìn)行拆分成數(shù)組,我們下面以 utf-8 編碼為例。
解決方案一我習(xí)慣的方法可能是:
mb_internal_encoding("UTF-8"); $str = "周夢(mèng)康"; $array = []; for ($i=0,$l = mb_strlen($str); $i < $l; $i++) { array_push($array, mb_substr($str, $i, 1, "utf-8")); } var_export($array);
假如我們沒(méi)裝mb擴(kuò)展怎么辦?
解決方案二今天看到一份代碼,別人是這么寫(xiě)的:
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計(jì)算的是字節(jié)數(shù),而直接使用$str[x]就沿用了c語(yǔ)言里面char數(shù)組和字符串的習(xí)慣,表示按字節(jié)來(lái)讀取$str,也就是說(shuō)每次讀取的數(shù)據(jù)的ascii碼值不可能大于255。而php里使用ord來(lái)獲取ascii碼值。
切割規(guī)則如下ascii 碼范圍 | 切割偏移量 |
---|---|
0 ~ 127 | 1 字節(jié) |
192 ~ 223 | 2 字節(jié) |
224 ~ 239 | 3 字節(jié) |
240 ~ 247 | 4 字節(jié) |
http://www.ruanyifeng.com/blo...Unicode
https://segmentfault.com/a/11... 口語(yǔ)化敘述 utf-8 的來(lái)歷
Unicode 只是一個(gè)符號(hào)集,它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒(méi)有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)。
UTF-8UTF-8 就是在互聯(lián)網(wǎng)上使用最廣的一種 Unicode 的實(shí)現(xiàn)方式。UTF-8 最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。
UTF-8 的編碼規(guī)則很簡(jiǎn)單,只有二條:
對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的 Unicode 碼。因此對(duì)于英語(yǔ)字母,UTF-8 編碼和 ASCII 碼是相同的(能容納0~127)。
對(duì)于n字節(jié)的符號(hào)(n > 1),第一個(gè)字節(jié)的前n位都設(shè)為1,第n + 1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的 Unicode 碼。
下表總結(jié)了編碼規(guī)則,字母x表示可用編碼的位:
Unicode 符號(hào)范圍(十六進(jìn)制) | UTF-8 編碼方式(二進(jìn)制) | UTF-8 首字節(jié)范圍 |
---|---|---|
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 |
想必看了這個(gè)表,大家就能明白了吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26305.html
摘要:大多數(shù)待遇豐厚的開(kāi)發(fā)職位都要求開(kāi)發(fā)者精通多線程技術(shù)并且有豐富的程序開(kāi)發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問(wèn)題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...
摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開(kāi)源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個(gè)專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...
摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開(kāi)源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個(gè)專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...
閱讀 2354·2021-11-24 10:27
閱讀 3593·2019-08-30 15:55
閱讀 3358·2019-08-30 15:53
閱讀 2359·2019-08-29 17:27
閱讀 1446·2019-08-26 13:47
閱讀 3561·2019-08-26 10:28
閱讀 929·2019-08-23 15:59
閱讀 2884·2019-08-23 15:19