我正在尝试删除字符串中的每个Unicode字符,如果它落在下面的任何范围内。
\uD800-\uDFFF
\u1D800-\u1DFFF
\u2D800-\u2DFFF
\u3D800-\u3DFFF
\u4D800-\u4DFFF
\u5D800-\u5DFFF
\u6D800-\u6DFFF
\u7D800-\u7DFFF
\u8D800-\u8DFFF
\u9D800-\u9DFFF
\uAD800-\uADFFF
\uBD800-\uBDFFF
\uCD800-\uCDFFF
\uDD800-\uDDFFF
\uED800-\uEDFFF
\uFD800-\uFDFFF
\u10D800-\u10DFFF
作为初始原型,我尝试使用replace
函数中的正则表达式删除第一个范围内的字符。
var buffer = "he\udfffllo world";
var output = buffer.replace(/[\ud800-\udfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
在这种情况下,角色似乎已被替换为罚款。
然而,当我用
替换它时var buffer = "he\udfffllo worl\u1dfffd";
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
我看到一些意想不到的东西。我的输出显示为:
he lloworl᷿fd被替换为
这里有两点需要注意:
\u1dfff
不会显示为一个字符 - \u1dff
会转换为字符,而f
会被视为自己的字符有关如何实现这一目标的任何建议都将不胜感激。
修改
我的总体目标是过滤掉encodeURIComponent
函数认为无效的所有字符。我运行了一些测试,发现上面的列表是一组无效的字符。例如,下面的代码首先将1dfff
转换为unicode字符,然后再将其传递给encodeURIComponent
,这会导致后一个函数引发异常。
var v = String.fromCharCode(122879);
var uriComponent = encodeURIComponent(v);
在@Blender指出我在代码中使用x
而不是u
来表示Unicode字符后,我编辑了部分问题。
编辑2
我调查了我的技术以进一步获取“无效”unicode范围,结果证明,如果你给String.fromCharacterCode
一个大于16位的数字,它只会查看最低的16位数字。这解释了我所看到的模式。事实证明,我只需要担心第一个范围。
答案 0 :(得分:4)
您似乎正在尝试从字符串中删除Unicode代理项代码单元。但是,只有U + D800到U + DFFF才是代理码点;您命名的其余值不是,可以分配给有效的Unicode字符。在这种情况下,以下内容就足够了(使用\u
而不是\x
来引用Unicode字符):
buffer.replace(/[\ud800-\udfff]/g, "");