我正在尝试删除字符串中的每个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

作为初始原型(prototype),我尝试通过在replace函数中使用正则表达式来删除第一个范围内的字符。
var buffer = "he\udfffllo world";
var output = buffer.replace(/[\ud800-\udfff]/g, "");
d.innerText = buffer + " is replaced with " + output;

在这种情况下,该 Angular 色似乎已被很好地替换。

但是,当我替换为
var buffer = "he\udfffllo worl\u1dfffd";
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, "");
d.innerText = buffer + " is replaced with " + output;

我看到了一些意想不到的事情。我的输出显示为:



这里有两件事要注意:
  • \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位。这就解释了我所看到的模式。事实证明,我只需要担心第一个范围。

    最佳答案

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

    buffer.replace(/[\ud800-\udfff]/g, "");
    

    09-25 17:16
    查看更多