Странные байты при преобразовании наборов кодовых точек в двоичные
Я задал вопрос Преобразование шаблонов кодовых точек в двоичную 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;
}