我正在使用以下转换器进行Unicode字符的拆分,而不是正常的'平面上。
function toUTF16Pair(x) {
var first = Math.floor((x - 0x10000) / 0x400) + 0xD800;
var second = ((x - 0x10000) % 0x400) + 0xDC00;
return '\\u'+first.toString(16) + '\\u'+second.toString(16);
}
我正在寻求性能改进(如果可能的话)。
答案 0 :(得分:2)
像往常一样,我自己带着一些二元魔法。请试着打败这个。
function toUTF16Pair(x) {
return '\\u' + ((((x - 0x10000) >> 0x0a) | 0x0) + 0xD800).toString(16)
+ '\\u' + (((x - 0x10000) & 0x3FF) + 0xDC00).toString(16)
}
如果有人想知道它是如何工作的:
>> 0x0a
- 是二进制右移10个位置,相当于除以1024
| 0x0
- 相当于Math.floor
& 0x3FF
- 因为2的模数可以表示为(x % n == x & (n - 1)
),在我的例子中是& 1063
十进制。
希望这能为您节省一些时间。