【发布时间】:2011-02-09 19:59:57
【问题描述】:
我想从 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 decoder capability and stress test。坏字符要么原封不动地通过,要么似乎删除了一些字节,从而创建了一个新的无效字符。
我不太熟悉 UTF-8 标准或 JavaScript 中的多字节,所以我不确定我是否未能在正则表达式中表示正确的 UTF-8,或者我是否在JavaScript。
编辑:根据 Tomalak 的评论在我的正则表达式中添加了全局标志 - 但这仍然对我不起作用。根据 bobince 的评论,我将放弃在客户端执行此操作。
【问题讨论】:
标签: javascript regex utf-8