0

1 小时前,我问过Transform patterns of code points in a binary的问题:我需要将集合转换为这样[$a-z]的二进制文件:

01 24 // $
00 // interval between 2 code points
61 00 // a
7a 00 // z

[$a-z]UnicodeSet站点获得了类似的集合。它只需要您输入一个模式并生成一个代码点集。

我已经重写了一些简单但不平凡的 UnicodeSet 到二进制集转换器。现在,我没有阅读真正的代码点,而是\u通过启用UnicodeSet 站点上的Escape选项来阅读它们的转义形式。我这样做是因为浏览器希望从返回的集合中删除一些字符。

但是,我自己将模式返回的集合的最终输出在[:age=5.0:]&[[:gc=L:][:gc=Nl:][:gc=Mn:][:gc=Mc:][:gc=Nd:][:gc=Pc:]\$_]我自己将其转换为二进制后看起来有错误的代理项。

药物...

我在输入集中读取和跳过单个代码点的功能是nextCodePoint

    function nextCodePoint()
    {
      u_ch = input.charCodeAt(inputOffset);
      __escaped__ = false;

      // Handle escape
      if (u_ch === 0x5C)
      {
        __escaped__ = true;
        u_ch = input.charCodeAt(inputOffset + 1);

        // Handle \u
        if (u_ch === 0x75)
        {
          inputOffset += 2;

          // Skip the left XXXX base
          u_start = inputOffset;
          inputOffset += 4;

          // Skip the right XXXX base (limited for messy patterns)
          if (input.charCodeAt(inputOffset) !== 0x5C)
            inputOffset += 4;

          return parseInt(input.slice(u_start, inputOffset), 16);
        }
      }
      ++inputOffset;
      return u_ch;
    }

有任何想法吗?

4

1 回答 1

0

我的 UTF-16 编码是正确的,但问题是我确实在寻找\u转义,但也没有寻找\U转义。UnicodeSet 站点返回\uXXXX\UXXXXXXXX在某些部分返回。

这里:

function nextCodePoint()
{
  u_ch = input.charCodeAt(inputOffset);
  __escaped__ = false;

  // Handle escape
  if (u_ch === 0x5C)
  {
    __escaped__ = true;
    u_ch = input.charCodeAt(inputOffset + 1);

    u_upper = (u_ch === 0x55);

    // Handle \u
    if (u_upper || (u_ch === 0x75))
    {
      inputOffset += 2;

      // Skip the left XXXX base
      u_start = inputOffset;
      inputOffset += 4;

      // Skip the right XXXX base
      if (u_upper) inputOffset += 4;

      return parseInt(input.slice(u_start, inputOffset), 16);
    }
  }
  ++inputOffset;
  return u_ch;
}
于 2017-08-15T17:38:18.057 回答