簡單來談談Unicode與emoji

什麼是Unicode

Unicode是國際組織制定的能夠容納世界上 全部文字和符號的字符編碼方案,它爲每種語言中的每一個字符設定了統一而且惟一的編碼。html

表示一個Unicode的字符時,一般會用「U+」而後緊接着一組十六進制的數字來表示這一個字符。好比: U+4E25,U+1F600, U+1F601java

那unicode和UTF-8有何區別?git

通俗點就是es6

  • Unicode 是「字符集」
  • UTF-8 是「編碼規則」

字符集:爲每個「字符」分配一個惟一的 ID(學名爲碼位 / 碼點 / Code Point)
編碼規則:將「碼點」轉換爲字節序列的規則github

JS中如何使用Unicode

編碼bash

1.字符串形式
javaScript 容許採用 \uxxxx形式表示一個字符,其中xxxx表示字符的 Unicode 碼點。僅限於碼點在 \u0000~\uFFFF之間的字符。超出這個範圍的字符,必須用兩個雙字節的形式表示。ui

"\u0061" // 'a'

// es6表示法(支持超過0xFFFF的數值)
"\u{1F601}"
複製代碼
  1. js方法

es5: String.fromCharCode(Unicode) (侷限於Unicode 碼點不大於0xFFFF)編碼

String.fromCharCode(65) //return "A"
複製代碼

es6: String.fromCodePoint(Unicode) (支持Unicode 碼點大於0xFFFF)es5

String.fromCodePoint('0x1F601') // "😁"
String.fromCodePoint('128513') // "😁"
複製代碼

解碼spa

es5: str.charCodeAt() (侷限於Unicode 碼點不大於0xFFFF)

var str = 'ABC'
str.charCodeAt(0) // 65
複製代碼

es6: str.codePointAt() (支持Unicode 碼點大於0xFFFF)

var str = "😁"
str.codePointAt(0) // 128513 10進制
str.codePointAt(0).toString(16) // "1f601" 16進制
複製代碼

emoji的編碼

emoji 也是一個Unicode字符。2010年,Unicode 開始爲 Emoji 分配碼點。
好比:U+1F4C5,U+1F468, U+1F600
Unicode 只是規定了 Emoji 的碼點和含義,並無規定它的樣式。舉例來講,碼點U+1F600表示一張微笑的臉,可是這張臉長什麼樣,則由各個系統本身實現。

若是用戶的系統沒有實現這個Emoji符號,用戶就會看到一個沒有內容的方框,由於系統沒法渲染這個碼點。

截至目前,共有2789個emoji字符;
參考連接:emoji-text

emoji組合

Unicode 容許多個碼點組合表示一個 Emoji。 經過 零寬度鏈接符U+200D實現。

U+1F468:男人
U+1F469:女人
U+1F467:女孩
好比U+1F468 U+200D U+1F469 U+200D U+1F467,就會顯示爲一個 Emoji 👨‍👩‍👧
若是用戶的系統不支持這種方法,就仍是顯示爲三個獨立的 Emoji 👨👩👧
複製代碼

零寬連字符(zero-width-joiner,ZWJ)是一個不打印字符,放在某些須要複雜排版語言(如阿拉伯語、印地語)的兩個字符之間。 零寬連字符使得這兩個本不會發生連字的字符產生了連字效果。零寬連字符的Unicode碼位是U+200D

// 多碼點轉成emoji組合
function unifiedToNative(unified) {
  var unicodes = unified.split('-'),
      codePoints = unicodes.map((u) => `0x${u}`)

  return String.fromCodePoint(...codePoints)
}

// 多組合emoji 轉成碼點
var s = '👩‍❤️‍👩';
for (let ch of s) {
  console.log(ch.codePointAt(0).toString(16)); // 1f469 200d 2764 fe0f 200d 1f469
}
複製代碼

感謝閱讀。

這是我的隨筆的地址,若是喜歡,star一個唄 ^_^

參考資料:

相關文章
相關標籤/搜索