国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 高級面試題 - 如果沒有 mb 系列函數,如何切割多字節字符串

bawn / 2759人閱讀

摘要:它可以使用個字節表示一個符號,根據不同的符號而變化字節長度。對于字節的符號,第一個字節的前位都設為,第位設為,后面字節的前兩位一律設為。剩下的沒有提及的二進制位,全部為這個符號的碼。

原文請關注我的博客 https://mengkang.net/1129.html
很多工程師在工作1~3年的時候最容易遇到瓶頸,不知道自己應該學習什么,面試總是吃閉門羹。那么 PHP 后面應該怎么學呢?安利一波我的系列直播 PHP 進階之路
需求

如果需要將可能含有中文的字符串進行拆分成數組,我們下面以 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 = 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

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

想必看了這個表,大家就能明白了吧。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26305.html

相關文章

  • Java開發

    摘要:大多數待遇豐厚的開發職位都要求開發者精通多線程技術并且有豐富的程序開發調試優化經驗,所以線程相關的問題在面試中經常會被提到。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 JVM 內存溢出實例 - 實戰 JVM(二) 介紹 JVM 內存溢出產生情況分析 Java - 注解詳解 詳細介紹 Java 注解的使用,有利于學習編譯時注解 Java 程序員快速上手 Kot...

    LuDongWei 評論0 收藏0
  • PHP面試常考內容之Memcache和Redis(1)

    摘要:以下正文的部分內容來自程序員面試筆試寶典書籍,如果轉載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統,它基于一個存儲鍵值對的來存儲數據到內存中。預告面試常考內容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發布的PHP面試常考內容之面向對象專題后,發布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時...

    wenyiweb 評論0 收藏0
  • PHP面試常考內容之Memcache和Redis(1)

    摘要:以下正文的部分內容來自程序員面試筆試寶典書籍,如果轉載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統,它基于一個存儲鍵值對的來存儲數據到內存中。預告面試常考內容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發布的PHP面試常考內容之面向對象專題后,發布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時...

    nanfeiyan 評論0 收藏0

發表評論

0條評論

bawn

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<