Странные байты при преобразовании наборов кодовых точек в двоичные

Я задал вопрос Преобразование шаблонов кодовых точек в двоичную 1 час назад: мне нужно было преобразовать такие наборы, как [$a-z] в двоичный файл, как это:

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

Я получаю наборы, как [$a-z] с сайта UnicodeSet. Вам просто нужно ввести шаблон и сгенерировать кодовую точку.

Я немного переписал мой простой, но нетривиальный конвертер UnicodeSet в двоичные множества. Теперь, вместо того, чтобы читать реальные кодовые точки, я читаю их экранированную форму \u включив опцию Escape на сайте UnicodeSet. Я сделал это, потому что браузер пытается удалить некоторые символы из возвращенного набора.

Однако мой окончательный вывод для набора, возвращаемого шаблоном [: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;
    }

Есть идеи?

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;
}
Другие вопросы по тегам