摘要:一個中文字符好,在編號是,你把放到到字符集中,字符集就識別不出是好字了,會出現一些莫名奇妙的亂碼。我一判斷是否是中文驗證漢字的正則表達式我們只是需要把中文的編號范圍圈出來,然后判斷字符是否在此范圍內即可。
本篇文章是本人純手寫,如有錯誤或者論述不當,歡迎各位同行給予指出。
前言我在看<
按Unicode官方的說法,Unicode是Unicode Standard(Unicode標準)的簡寫,所以Unicode即是指Unicode標準。
按wiki的說法,它是一個計算機工業標準(a computing industry standard)。
所以我們先需要明白兩個概念,字符集和編碼。
這里我重點推薦字符集與編碼這篇文章,對字符集說的很詳細。如果還有不清楚"字符集"的小伙伴。我這里可以給小伙伴們形象的舉例說明下。字符集可以類比于我們的身份證系統,我們每個人都是有一個身份證號,字符集中的每一個展示的字符都有字符編號。比如你是張三,你的身份證號就是XXX1,你是王二,身份證號就是XXX2。你拿身份證在中國是能分辨出你是誰。但是你去美國,人家是不認你的身份證,你需要有美國中相關證件,人家美國才能分辨你是誰,不然,你就被當做非法移民。同理,在字符集中。一個中文字符"好",在Unicode編號是【597d】,你把【597d】放到到ASCII字符集中,ASCII字符集就識別不出是"好"字了,會出現一些莫名奇妙的亂碼。就會有很多不同的字符集。我們這些小伙伴們只要記住所謂字符集就是一個標準,一個規范,但是不同的字符集中標準和規范是不一樣的。那字符集能用來干嘛呢? 主要是用來指導我們在計算機中去定位字符。既然定位字符,自然就會給每個字符定義一個編號,編號肯定是唯一的,不用想,不然你一個編號去定位兩個或者多個字符,那計算機就無法判斷你所需要的字符是哪個。字符集中,如何定義那個字符的編號,這事已經不需要我們關心了。ASCII字符集、GBK字符集、Unicode字符集,都已經有官方的組織幫我們定義好了,我們只管使用就行。當然,世界上現在最通用的字符集就是Unicode啦
編碼這里我重點推薦字符集與編碼(二)——編號 vs 編碼這篇文章,對編號與編碼說的很詳細。我總結一句話就是: 編碼就是對字符集中的編號進行編碼
注意!!!字符集中編號是固定的,但是對其中的編號進行編碼方式是多種多樣的
拿我們常用的Unicode字符集舉例,就有UCS-2、UTF-8、UTF-16、UTF-32等多種編碼方式。
為了讓小伙伴們更好的了解編碼是什么,我這里做了一個小試驗。
打開 Ultraedit,創建一個文件,名稱叫做a.js。里面輸入一個字符"好"
里面的文件編碼方式是UTF-8,我們還可以通過查看16進制查看該字符的存儲編碼是E5A5BD,表示三個字節。
可能有小伙伴覺很奇怪,UTF-8是屬于Unicode字符集么。那么保存的16進制應該就是597d,怎么變成了E5A5BD。
這里給這些小伙伴解答一下疑惑。我們需要明白UTF-8是一種編碼方式,它會按照一定的規則對Unicode中字符的編號進行轉換,既然經過轉化,就不可能存儲還是原始的字符的編號。我們在上面看到的16進制。已經是經過UTF-8對這個字符的編號進行轉換過后的內容,不是它原始的編號【597d】。同樣的,當我們用的電腦去讀取上面存儲的文本的(16進制的E5A5BD),電腦也是需要一定的規則去把內容轉化為Unicode的編號。
為了驗證讀取也是需要規則的想法,我們把編碼變成UTF-16LE,我們再看文本,就變成了亂碼
我們查看里面的16進制內容,依然是沒有發生變化
為什么變成了亂碼,因為存儲的規則(UTF-8)與讀取的規則不一樣(UTF-16LE),于是就導致了亂碼。但是讀取時候存儲的文件內容是沒有變化的,還是E5A5BD。只是顯示給用戶看的時候,變成了亂碼。
在這里給小伙伴們saowie總結一下。 所謂編碼其實就是對字符集里面的編號進行轉換的規則。像UTF-8有UTF-8的規則(PS: UTF-8轉Unicode的轉換規則網絡資料很多,自行百度、google,這里不再補充), UTF-16LE有UTF-16的規則,當我們在保存和讀取文件時候,需要告訴我們的計算機是什么規則。好讓我們的計算機去通過相應的規則去獲取對應的字符。(PS:當然現在很多軟件默認編碼方式是UTF-8, 已經給我們定義好了,不需要我們去特意更改編碼)。
JavaScript與Unicode現在大家對字符集合字符編碼應該已經不陌生了, 下面我們一起探討下,JavaScript與字符集的關系。
這里我們可以參考阮一峰的Unicode與JavaScript詳解,說的很不錯。
這里我給小伙伴們指出一下重點: javaScript是使用Unicode字符集的,但它的編碼方式是UCS-2(歷史原因),并且UCS-2的編碼與Unicode的編號幾乎一樣。所以,我們可以在JS中直接使用轉義后Unicode的編號就能獲取對應字符,比如u597d => 好。
最后,這里給小伙伴們補充幾個例子,用于加深理解。
A1. JS中獲取字符的幾種方式
A. 直接通過鍵盤輸入, 這個不多說
B. Unicode轉義序列, javaScript中可以通過6位ASCII碼來表示一個Unicode編碼, 其中u是前綴,后面4位16進制數,也就是你想要字符的編號來獲取相應的字符。
console.log("u597d") // => 好 console.log("u6211") // => 我
C. 通過String.fromCharCode獲取字符, javaScript中給開發人員提供了一個可以通過Unicode編號直接獲取字符的API。String.fromCharCode
String.fromCharCode(0x6211, 0x4e00) // => 我一
A2. 判斷是否是中文
// /^[u4e00-u9fa5]+$/ 驗證漢字的正則表達式 function isAllChinese(str) { return /^[u4e00-u9fa5]+$/.test(str); }
我們只是需要把中文的Unicode編號范圍圈出來,然后判斷字符是否在此范圍內即可。
A3. javaScript獲取字符的Unicode編號
var str = "好好學習"; for (var i = 0, length = str.length; i < length; i++) { console.log(str.codePointAt(i).toString(16)) //=> 597d 597d 5b66 4e60 }
文章中所用Unicode編號在其他文章中被稱為碼點,兩個所指都是同一個內容,望小伙伴們不要誤解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107136.html
摘要:總結通過使用和,我們能夠在數據和二進制數據中進行互相轉換。下一篇系列相關的博客,將會介紹如何通過來向后端傳遞二進制數據,以及如何處理通過收到的二進制數據。 概述 上一篇博客我們說到了如何進行數字類型(如Short、Int、Long類型)如何在JavaScript中進行二進制轉換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數字數據如何轉換為...
摘要:寫快一年了發現基礎越來越重要寫點基礎的來共勉以及方便之后回看和不同,是構造函數是變量的一種類型是的實例聲明一個字符串之后使用是否包含判斷一個字符串是否被包含在另一個字符串中包含返回不包含返回查詢包含的字符串從什么位置開始切割字符串獲取字符串 寫js快一年了,發現基礎越來越重要,寫點基礎的來共勉以及方便之后回看. String和string不同,String是構造函數,string是變量...
摘要:概念是一種針對的可變長度字符編碼,又稱萬國碼。通過上面的介紹我們可以知道,是一種非常通用的可變長字符編碼方式。概念是字符編碼五層次模型的第三層字符編碼表,也稱為的一種實現方式。 概述 本文通過介紹Unicode編碼以及對應的兩種編碼方式UTF-8和UTF-16,讓讀者能夠了解關于字符串編碼的相關知識,同時能夠弄清楚Unicode和UTF-8和UTF-16之間的關系。 本文的主要內容為:...
摘要:閑談系列不涉及具體的講解,只會勾勾畫畫一些自己認為比較重要的特性。我們一般認為用兩個字節位表示,并且完全囊括了字符集。將其轉換成進制就是只是表示它們是碼。三的讀取和寫入相關重要的只有能夠讀寫,才能夠顯示其存在的價值。 原文地址:http://www.cnblogs.com/DeanCh... 在剛接觸Nodejs的時候,有些概念總讓學前端的我感到困惑(雖然大學的時候也是在搞后端,世界上...
摘要:單體內置對象對內置對象的定義是由實現提供的不依賴于宿主環境的對象,這些對象在程序執行之前就已經存在了。還定義了兩個單體內置對象和。此外,所有原生引用類型的構造函數,像和,也都是對象的屬性。 單體內置對象 ECMA-262 對內置對象的定義是「由 JavaScript 實現提供的、不依賴于宿主環境的對象,這些對象在 JavaScript 程序執行之前就已經存在了」。意思就是說,開發人員不...
閱讀 3616·2021-11-24 10:22
閱讀 3686·2021-11-22 09:34
閱讀 2480·2021-11-15 11:39
閱讀 1528·2021-10-14 09:42
閱讀 3662·2021-10-08 10:04
閱讀 1553·2019-08-30 15:52
閱讀 847·2019-08-30 13:49
閱讀 3015·2019-08-30 11:21