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

时间:2013-06-02 02:27:25

标签: 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

作为初始原型,我尝试使用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被替换为

这里有两点需要注意:

  1. \u1dfff不会显示为一个字符 - \u1dff会转换为字符,而f会被视为自己的字符
  2. 结果是一个空字符串。
  3. 有关如何实现这一目标的任何建议都将不胜感激。


    修改

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

    var v = String.fromCharCode(122879);
    var uriComponent = encodeURIComponent(v);
    

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


    编辑2

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

1 个答案:

答案 0 :(得分:4)

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

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