【问题标题】:How can I improve performance of UTF32 to UTF16 surrogate pair converter如何提高 UTF32 到 UTF16 代理对转换器的性能
【发布时间】:2016-10-02 10:47:07
【问题描述】:

我正在使用以下转换器对不在“正常”平面中的 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);
}

我正在寻求性能改进(如果可能的话)。

【问题讨论】:

  • 您是否考虑过迭代、创建新字符/代码点的数组并在最后加入它们?由于 JS 字符串是不可变的,这可能会更快。
  • @ssube 它们在一堆“正常”的 unicode 中,我想在我确实有链的情况下,这可能是值得的,但我仍然会先阅读它们以识别它们是 UTF32那些。
  • 我会将您的替换调用转换为 hex.forEach 类型循环并通过原样传递“好”代码点,但是当您遇到一个最终会成对出现的点时,请改为返回该对.获取结果并join 他们一次。
  • 请告诉我们你是如何调用这个函数的。
  • @Bergi 嗨,Bergi,它可以不同,通常是一些 jquery 选择 .text() 拆分 ; 或者它可以是 symbol.getCharCodeAt(0).toString(16)。检查if (x >= 0x10000 && x <= 0x10FFFF) 在函数之外,如果字符不在,它不会被调用。我想我会将问题缩小到仅实际算法位,并将删除检查并替换为干净的十六进制代码,因为其他位确实可以单独查看。

标签: javascript performance unicode


【解决方案1】:

像往常一样,我自己使用了一些二进制魔法。请尝试打败它。

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
@ 987654325@ - 因为 2 的模可以表示为 (x % n == x & (n - 1)),在我的例子中是十进制的 & 1063

希望这可以为您节省一些时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2017-01-06
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多