Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除javascript中不同范围内的Unicode字符_Javascript_Regex_Unicode_Replace_Astral Plane - Fatal编程技术网

删除javascript中不同范围内的Unicode字符

删除javascript中不同范围内的Unicode字符,javascript,regex,unicode,replace,astral-plane,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-

我试图删除字符串中的每个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 v = String.fromCharCode(122879);
var uriComponent = encodeURIComponent(v);
在这种情况下,字符似乎已被替换为罚款

但是,当我用

var buffer = "he\udfffllo worl\u1dfffd";
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
我看到了意想不到的事情。我的输出显示为:

他�世界杯᷿fd被替换为

这里有两件事需要注意:

  • \u1dfff
    不会显示为一个字符-
    \u1dff
    将转换为一个字符,并将其结尾处的
    f
    视为自己的字符
  • 结果是一个空字符串
  • 任何关于我如何实现这一目标的建议都将不胜感激


    编辑

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

    var buffer = "he\udfffllo world";
    var output = buffer.replace(/[\ud800-\udfff]/g, "");
    d.innerText = buffer + " is replaced with " + output;
    
    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字符):


    \xdfff
    被解释为
    \xdf
    f
    f
    。啊,你是对的,这解释了为什么我在第二次尝试中看到奇怪的结果。现在更改问题的这一部分。表示法
    \u1D800
    和大多数其他表示法根本无效(或者,从技术上讲,
    \u1D800
    表示U+1D80后跟数字零。请用Unicode字符表示问题,不要使用假定字符(无效)他们的逃避符号。@JukkaK.Korpela我经常注意到的是,对某个主题有过一段时间了解的人经常忘记,其他探讨同一主题的人甚至都不知道正确表述问题的基础知识。事实上,如果他们知道,他们就足够自己回答问题了,leavin我不是在鼓吹懒惰;我做了研究,只是不知道应该在搜索引擎中输入什么样的关键词,这就是为什么我选择了这样。所以我用我所知道的最好的方法来表达我的问题,并将其发布在这里,甚至随着我学到的更多内容而进行编辑。谢谢彼得的回答。我编辑了这个问题以包含更多内容关于我如何提出需要删除的字符列表的详细信息。在我将\x替换为\u后,我不再出现语法错误,但我确实注意到了我在编辑中概述的一些其他有趣的行为。再次感谢您的关注。进一步深入研究,结果表明,您是对的,我只需要担心第一个范围。我在对问题的第二次编辑中添加了一个解释。