我在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;
}
有什么想法吗?
答案 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;
}