簡介
字符編碼、字符長度錯誤、截取字符錯誤、UTF8、Unicode
計算機(jī)重重底層之下都是由 0 和 1 組合,但是你知道他們是怎么一步步變成字符串的嘛?在我們現(xiàn)實(shí)生活中最常見的例子可以通過 wo 在新華字典中找到 我 這個字。同樣計算機(jī)通過 0 和 1 組合在 字典 中查找到對應(yīng)的字符,那 字典 內(nèi)容是什么呢?
計算機(jī)誕生于 美國 它的使用者大多數(shù)使用英文,美國國家標(biāo)準(zhǔn)學(xué)會 便制定了這本字典包括了 26個大寫英文字母、26個小寫英文字母、10個阿拉伯?dāng)?shù)字等總共 256 個字符的 ASCII 字符集。
ASCII 用二進(jìn)制來表示就是 0000 0000 到 1111 1111 被用得滿滿當(dāng)當(dāng),漢字就沒有地方可以放得下了這下怎么辦?正所謂江山大有人才出,國標(biāo)編碼 GB 系列出現(xiàn)了,其中最耳熟能詳?shù)木褪?GB2312。
那么問題來了世界擁有 2500 至 3500 種語言,有文字的語言有 930 種。你能想象你在瀏覽不同語言界面的時候,需要自己不斷的去切換 字典 并且 每次切換查找不到的字符就會亂碼出現(xiàn)。
書同文,車同軌,行同倫。
上面這句話歌頌了秦始王具有跨時代意義的成就,但是現(xiàn)實(shí)世界中統(tǒng)一語言顯得不可能。那我們能否換個思路解決這個問題呢?先思考一個問題:“把大象放入冰箱需要幾步”,答案大家都知道“打開,裝進(jìn)去,關(guān)上”。那統(tǒng)一字符怎么辦呢?那就是創(chuàng)建一個足夠大的字典把所有的字符都放進(jìn)去。
Unicode 萬國碼 轟隆一聲誕生了,顧名思義統(tǒng)一了全世界的所有文字編碼可以到 Unicode Consortium 和 codepoints 中查看,對應(yīng)的實(shí)現(xiàn)有UTF8、UTF16
、UTF-32。
UTF8、UTF16、UTF-32最大區(qū)別在于對應(yīng)多少字節(jié)的數(shù)據(jù),越大能存儲的字符也就越多。其中 UTF-8 就是在互聯(lián)網(wǎng)上使用最廣的一種 Unicode 的實(shí)現(xiàn)方式,也就是現(xiàn)在 html 中最??吹降? 所聲明字符集。
UTF 最大的特點(diǎn)在于可變長的字節(jié),例如 UTF8 可以是 1到4個字節(jié)來記錄 萬國碼,為什么這么設(shè)計呢?日常使用得到的字符對應(yīng)的字符編碼沒有必要占用這么多字節(jié),例如 0000 0000 和 0000 0000 0000 0000 都能表示 0,那使用更短的字節(jié)所占用的空間更小,傳輸?shù)乃俣雀臁?/p>
在統(tǒng)一編碼的過程中還出現(xiàn)了一個字符集 UCS-2,它固定使用 2個字節(jié)來編碼 與 UTF 可變長度字符編碼有一定程度上的不同,但是隨著統(tǒng)一進(jìn)程下被 UTF-16 收編了。
JavaScript 字符處理了解字符基本原理和進(jìn)程后,那么 JavaScript 是什么編碼呢?沒錯它就剛才 小插曲 中提到的 UCS-2,原因是 JavaScript 誕生時 UTF-16 還沒有出現(xiàn)。
但是現(xiàn)在大家都在使用 UTF 可變長度字符編碼,UTF-16 的可變字節(jié)為 2個或者 4個,而 UCS-2 卻只有 2個。這樣兩個字符集之間就有存在一個 UCS-2 無法識別的 4字節(jié),JavaScript 在處理字符時會傻傻的按著 UCS-2 的兩字節(jié)去處理,再加上字典里沒有這個字符笨笨的小腦袋瓜無法處理只能輸出亂碼。
由于 emoji 表情的普及,而且 emoji 剛好就是處于 UCS-2 的字典之外,在前端開發(fā)中遇到可能出現(xiàn) emoji 的地方需要小心謹(jǐn)慎:
長度現(xiàn)在最為常用的 emoji 表情為 4個字節(jié)編碼表示,由于 UCS-2 固定兩個字節(jié),在統(tǒng)計長度時 emoji 會被當(dāng)做兩個 UCS-2 字符,結(jié)果會和我們預(yù)期的輸出大了一倍。
let emoji = "
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102984.html
showImg(https://raw.githubusercontent.com/pushmetop/resource/master/30-seconds-for-everyday/url/poster.png); 簡介 URL結(jié)構(gòu)、組成、query、hash、axios數(shù)組傳遞錯誤、HTTP 請求 伴隨著微信消息的提示音 小四 發(fā)來一段代碼說 不知道為什么請求不到頁面數(shù)據(jù): axios.get...
showImg(https://segmentfault.com/img/remote/1460000018808058?w=900&h=500); 簡介 SEO、sitemap、搜索引擎優(yōu)化、簡單教程 在曖昧期和暗戀期時心里總是懸掛著: ta 為什么還不和我表白? ta 是不是對我沒感覺? ta 是不是只是把我當(dāng)備胎? ta 是不是對誰都這樣? 解決問題最簡單的方式就是直接 問問對方...
簡介 數(shù)組、對象、CSV、表格、工具 我們在 每日 30 秒之 arrayToCSV 中一起學(xué)習(xí)了將數(shù)組數(shù)據(jù)轉(zhuǎn)化為 csv 表格數(shù)據(jù)并導(dǎo)出,那如果是對象數(shù)組怎么辦呢?小腦袋瓜轉(zhuǎn)得快的同學(xué)肯定會說:使用 Array.prototype.map 把需要導(dǎo)出的字段先遍歷取出,再使用 arrayToCSV 將其導(dǎo)出為 CSV 數(shù)據(jù)表格。 可是你有沒有想過如果一個對象數(shù)組數(shù)據(jù)非常之大時,使用 Array.p...
簡介 字符串、數(shù)字、數(shù)組、對象、時間、類型、等于 科學(xué)家發(fā)現(xiàn),人腦中會分泌多種能讓人感到快樂、安全和成就感的物質(zhì),這些物質(zhì)統(tǒng)稱為快樂素。通常情況下,快樂素的釋放水平很低,維持我們心情平靜。只有當(dāng)我們完成了預(yù)設(shè)目標(biāo),作為獎勵,大腦才會增加快樂素的分泌,讓人感受到滿足和成功的喜悅。 這是之前看到的一篇關(guān)于 大腦獎勵機(jī)制 文章的一段話,為了要獲得獎勵我們需要有預(yù)設(shè)目標(biāo),而是每日 30 秒系列也是為了幫助...
showImg(https://segmentfault.com/img/remote/1460000018771004?w=900&h=500); 簡介 數(shù)組、CSV、表格、工具 將一個數(shù)組轉(zhuǎn)化為逗號為分割符的字符串(CSV)即表格數(shù)據(jù)。 // 該源碼來自于 https://30secondsofcode.org const arrayToCSV = (arr, delimiter = ,) =...
閱讀 1632·2021-09-08 10:42
閱讀 3617·2021-08-11 10:23
閱讀 3993·2019-08-30 14:10
閱讀 2743·2019-08-29 17:29
閱讀 3101·2019-08-29 12:50
閱讀 652·2019-08-26 13:36
閱讀 3466·2019-08-26 11:59
閱讀 1501·2019-08-23 16:23