简单来谈谈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一个呗 ^_^

参考资料:

相关文章
相关标签/搜索