```javascript strTest = strTest.replace(/([\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})|./g, "$1"); ```
看起来 UTF-8 验证正则表达式描述在这里是更完整的,我用同样的方式进行了适应:
```javascript 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 的评论,我放弃在客户端执行此操作。