将代码点集转换为二进制时的奇怪字节

时间:2017-08-15 15:49:45

标签: javascript node.js unicode codepoint

我在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

我从UnicodeSet网站获得了[$a-z]这样的集合。它只需要您输入模式并生成代码点集。

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

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

drugs...

我在输入集中读取和跳过单个代码点的功能是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;
    }

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
}