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