本篇文章是本人純手寫,若有錯誤或者論述不當,歡迎各位同行給予指出。javascript
我在看<<JavaScript權威指南>的時候,給咱們介紹了javascript的所使用的字符集是Unicode。因而我就開始慢慢了解javaScript與Unicodehtml
按Unicode官方的說法,Unicode是Unicode Standard(Unicode標準)的簡寫,因此Unicode便是指Unicode標準。
按wiki的說法,它是一個計算機工業標準(a computing industry standard)。
因此咱們先須要明白兩個概念,字符集和編碼。java
這裏我重點推薦字符集與編碼這篇文章,對字符集說的很詳細。若是還有不清楚"字符集"的小夥伴。我這裏能夠給小夥伴們形象的舉例說明下。字符集能夠類比於咱們的身份證系統,咱們每一個人都是有一個身份證號,字符集中的每個展現的字符都有字符編號。好比你是張三,你的身份證號就是XXX1,你是王二,身份證號就是XXX2。你拿身份證在中國是能分辨出你是誰。可是你去美國,人家是不認你的身份證,你須要有美國中相關證件,人家美國才能分辨你是誰,否則,你就被當作非法移民。同理,在字符集中。一箇中文字符"好",在Unicode編號是【597d】,你把【597d】放到到ASCII字符集中,ASCII字符集就識別不出是"好"字了,會出現一些莫名奇妙的亂碼。就會有不少不一樣的字符集。咱們這些小夥伴們只要記住所謂字符集就是一個標準,一個規範,可是不一樣的字符集中標準和規範是不同的。那字符集能用來幹嗎呢? 主要是用來指導咱們在計算機中去定位字符。既然定位字符,天然就會給每一個字符定義一個編號,編號確定是惟一的,不用想,否則你一個編號去定位兩個或者多個字符,那計算機就沒法判斷你所須要的字符是哪一個。字符集中,如何定義那個字符的編號,這事已經不須要咱們關心了。ASCII字符集、GBK字符集、Unicode字符集,都已經有官方的組織幫咱們定義好了,咱們只管使用就行。固然,世界上如今最通用的字符集就是Unicode啦正則表達式
這裏我重點推薦字符集與編碼(二)——編號 vs 編碼這篇文章,對編號與編碼說的很詳細。我總結一句話就是: 編碼就是對字符集中的編號進行編碼網絡
注意!!!字符集中 編號是固定的,可是對其中的 編號進行 編碼方式是多種多樣的
拿咱們經常使用的Unicode字符集舉例,就有UCS-二、UTF-八、UTF-1六、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, 已經給咱們定義好了,不須要咱們去特地更改編碼)。google
如今你們對字符集合字符編碼應該已經不陌生了, 下面咱們一塊兒探討下,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進制數,也就是你想要字符的編號來獲取相應的字符。spa
console.log('\u597d') // => 好 console.log('\u6211') // => 我
C. 經過String.fromCharCode獲取字符, javaScript中給開發人員提供了一個能夠經過Unicode編號直接獲取字符的API。String.fromCharCode.net
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編號在其餘文章中被稱爲 碼點,兩個所指都是同一個內容,望小夥伴們不要誤解