在javascript中删除各种范围内的Unicode字符

K M*_*hta 5 javascript regex unicode replace astral-plane

我试图删除字符串中的每个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
Run Code Online (Sandbox Code Playgroud)

作为初始原型,我试图通过在replace函数中使用正则表达式来删除第一个范围内的字符.

var buffer = "he\udfffllo world";
var output = buffer.replace(/[\ud800-\udfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,角色似乎已被替换为罚款.

但是,当我用它替换它

var buffer = "he\udfffllo worl\u1dfffd";
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
Run Code Online (Sandbox Code Playgroud)

我看到一些意外的事情 我的输出显示为:

hellloworl᷿fd被替换为

这里有两点需要注意:

  1. \u1dfff不显示为一个字符 - \u1dff转换为字符,f最后它被视为自己的字符
  2. 结果是一个空字符串.

关于如何实现这一目标的任何建议都将非常感激.


编辑

我的总体目标是过滤掉encodeURIComponent函数认为无效的所有字符.我运行了一些测试,发现上面的列表是一组无效的字符.例如,下面的代码,1dfff在传递之前首先转换为unicode字符,encodeURIComponent导致后一个函数引发异常.

var v = String.fromCharCode(122879);
var uriComponent = encodeURIComponent(v);
Run Code Online (Sandbox Code Playgroud)

在@Blender指出我正在使用x而不是u在我的代码中表示Unicode字符时,我编辑了部分问题.


编辑2

我调查了我的技术,以进一步获取"无效"的unicode范围,事实证明,如果你给出String.fromCharacterCode一个大于16位的数字,它只会看到数字的最低16位.这解释了我所看到的模式.事实证明,我只需要担心第一个范围.

Pet*_* O. 5

您似乎正在尝试从字符串中删除 Unicode 代理代码单元。但是,只有 U+D800 到 U+DFFF 是代理代码点;您命名的其余值不是,可以分配给有效的 Unicode 字符。在这种情况下,以下内容就足够了(使用\u而不是\x引用 Unicode 字符):

buffer.replace(/[\ud800-\udfff]/g, "");
Run Code Online (Sandbox Code Playgroud)