【问题标题】:Weird bytes when converting code point sets into binary将代码点集转换为二进制时出现奇怪的字节
【发布时间】:2017-08-15 15:49:44
【问题描述】:

我在 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:]\$_] 返回的集合在我自己转换为二进制后的最终输出看起来有错误的代理项。

我用于读取和跳过输入集中单个代码点的函数是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;
    }

有什么想法吗?

【问题讨论】:

  • 输入究竟是什么,预期的输出是什么,该函数的实际输出是什么?
  • @Bergi 输入是一个文件,其中包含 UnicodeSet 站点返回的代码点集,我们在其中放置了诸如 [:gc=L:] 之类的模式。我的问题中甚至还有一个。输出太大,很难确定,我不能放在这里。
  • @Bergi 请忽略我关于更大代码点的警告。我看错了。
  • 我认为如果您可以将代码简化为更小的示例,您的问题(以及您之前的问题)会更容易回答,该示例也不需要文件 IO,但具有硬编码没有按预期工作的示例。
  • @Bergi 我更新了我的问题。我也解决了我的问题......也许我在没有 IO 的情况下更新了我之前的示例。

标签: javascript node.js unicode codepoint


【解决方案1】:

我的 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;
}

【讨论】:

    猜你喜欢
    • 2016-12-07
    • 2016-10-04
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多