【问题标题】:Conversion from code point to UTF-16 code unit surrogate pair从代码点转换为 UTF-16 代码单元代理对
【发布时间】:2020-02-20 15:59:07
【问题描述】:

我正在尝试将 Unicode 字符转换为 UTF-16 代理对:

角色“带着医用口罩的脸”???是代码点U+1F637

二进制是:1 1111 0110 0011 0111

根据Wikipedia 将其编码为 UTF-16 我需要执行以下操作:

  1. 从代码点中减去 0x10000

    11111011000110111 - 10000 = 011111011000100111

  2. 高十位(在 0x000–0x3FF 范围内)被添加到 0xD800 以给出第一个 16 位代码单元或高代理 (W1)

    0001111101 + 1101100000000000 = 01101100001111101 (D87D)

  3. 将低十位(也在 0x000–0x3FF 范围内)添加到 0xDC00 以提供第二个 16 位代码单元或低代理 (W2),其范围为 0xDC00–0xDFFF。

    1000100111 + 1101110000000000 = 01101111000100111 (DE27)

所以我有两个代码单元D87DDE27,但我知道正确的结果是:

console.log('\uD83D\uDE37')

我做错了什么?

【问题讨论】:

    标签: unicode utf-16


    【解决方案1】:

    你有:

    0x10000 is subtracted from the code point 
    
    11111011000110111 - 10000 = 011111011000100111
    

    但是 0x10000 在二进制中是 1 0000 0000 0000 0000。因此正确的算术是:

    1 1111 0110 0011 0111 - 1 0000 0000 0000 0000 = 0 1111 0110 0011 0111
    

    【讨论】:

      猜你喜欢
      • 2021-06-15
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 2020-10-04
      • 2017-06-20
      相关资源
      最近更新 更多