我想从JavaScript中的字符串中删除所有无效的UTF-8字符.我试过这个JavaScript:
strTest = strTest.replace(/([\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})|./g, "$1");
似乎这里描述的UTF-8验证正则表达式(已删除链接)更完整,我以相同的方式调整它:
strTest = strTest.replace(/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./g, "$1");
这两段代码似乎都允许有效的UTF-8通过,但是我的测试数据中几乎没有过滤任何坏的UTF-8字符:UTF-8解码器功能和压力测试.要么坏字符没有变化,要么删除了一些字节,从而创建一个新的无效字符.
我不是很熟悉UTF-8标准或JavaScript中的多字节,所以我不确定我是否未能在正则表达式中表示正确的UTF-8,或者我是否在JavaScript中不正确地应用该正则表达式.
编辑:根据Tomalak的评论为我的正则表达式添加了全局标志 - 但是这仍然不适合我.根据bobince的评论,我放弃了在客户端这样做.