我們曉得unicode字符集的局限是U+0000到U+10ffff
个中每一個unicode碼點對應一個字符,假如這個碼點還沒有設置字符,默許會是?
假如字符在U+0000到U+ffff我們能夠輕鬆地運用Unicode轉義序列舉行示意
'a' === '\u0061'
然則假如局限大於U+ffff時我們就需要兩個如許的序列來示意,也叫代辦對,比方
'?' === '\ud83d\udebe'
這顯然是異常貧苦的
es6針對unicode新增了一個新的轉義序列,能夠叫為碼點轉義序列
'?' === '\u{1f6be}'
運用一個大括號圍困一串對應碼點的16進制數值,數值能夠為1到6位數
除了新增示意字符的要領外,也新增了讀取字符碼點的要領
我們曉得js的字符在內存中是按UTF-16對字符舉行編碼,也就是說js操縱字符的基本單位是
2個字節,因而es6之前的要領對操縱由代辦對天生的字符會出現問題,比方chartAt,charCodeAt,length,slice,indexOf等都不能返回你所希冀的效果,比方
'?'.length === 2
'?'.charCodeAt(0) === 55357
為了獵取準確的碼點值我們能夠運用 codePointAt
'?'.codePointAt(0) === 128702
128702..toString(16) === '1f6be'
經由過程碼點值我們也能夠獵取響應的字符 運用的是fromCodePoint這個靜態要領,傳入的是一個數值
String.fromCodePoint(0x1f6be) === "?"
String.fromCodePoint(128702) === "?"
應用這個要領我們就能夠異常方便地枚舉出悉數Unicode字符集對應的字符了
我找了一下找到挺多風趣的字符
‘©’,’®’,’°’,’±’,’¼’,’ϾϿ’,’֍’,’Ⅸ’,’∜’,’⒇’,’⓻’,’♽’,’⬢’,’⭐’,’⯑’,’☯’
‘?’,’?’,’?’,’?’,’?’,’?’,’?’,’?’,’?’,’?’,’?’
為了準確獵取字符的長度,我們能夠應用新增的es6擴大運算符
[...'?'].length === 1
關於字符的婚配,正則表達式也增加了/u修飾符
/\u{1f6be}/.test('?') === false
/\u{1f6be}/u.test('?') === true
能夠說es6新增的要領基本上周全考慮到unicode的全部字符集,
下面的要領能夠異常方便地獵取全部字符集,假如不怕死機能夠一次悉數獵取
function renderUnicode(min,max) {
let diff = 1024;
function render() {
const ele = document.getElementsByClassName('box')[0];
const textNode = ele.firstChild;
let str = ''
for (let i = min; i < min + diff; i++) {
str += String.fromCodePoint(i);
}
min = min + diff;
textNode.appendData(str);
if (min > max) {
alert('done');
return;
}
requestAnimationFrame(render);
}
render();
}
renderUnicode(0x0000, 0xffff);//BMP平面
// renderUnicode(0x10000, 0x1ffff);
// renderUnicode(0x20000, 0x2ffff);
// renderUnicode(0x30000, 0x3ffff);
// renderUnicode(0x40000, 0x4ffff);
// renderUnicode(0x50000, 0x5ffff);
// renderUnicode(0x60000, 0x6ffff);
// renderUnicode(0x70000, 0x7ffff);
// renderUnicode(0x80000, 0x8ffff);
// renderUnicode(0x90000, 0x9ffff);
// renderUnicode(0xA0000, 0xAffff);
// renderUnicode(0xB0000, 0xBffff);
// renderUnicode(0xC0000, 0xCffff);
// renderUnicode(0xD0000, 0xDffff);
// renderUnicode(0xE0000, 0xEffff);
// renderUnicode(0xf0000, 0xfffff);
// renderUnicode(0x100000, 0x10ffff);