Remove non-ascii character in string

var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

and i need to remove all non-ascii character from string,

means str only contain "INFO] (Higashikurume)";

147508 次浏览

可以使用以下正则表达式替换非 ASCII 字符

str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

但是,请注意,空格、冒号和逗号都是有效的 ASCII,因此结果将是

> str
"INFO] :, , ,  (Higashikurume)"

ASCII 在0到127之间,因此:

str.replace(/[^\x00-\x7F]/g, "");

带重音使用 ASCII:

var str = str.replace(/[^\x00-\xFF]/g, "");

它也可以通过一个积极的移除主张来实现,如下:

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

这使用 Unicode。在 Javascript 中,当为正则表达式表达 unicode 时,字符是用转义序列 \u{xxxx}指定的,但是也必须显示标志 'u'; 注意,正则表达式有标志 'gu'

我称之为“移除的积极断言”,意思是“积极”断言表示要移除哪些字符,而“消极”断言表示不要移除哪些字母。在许多情况下,否定的断言,如前面的答案所述,可能对读者更具暗示性。回旋曲线“ ^”表示“不”,范围“ \x00-\x7F”表示“ ascii”,所以两者一起表示“ not ascii”

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

对于那些只关心英语的英语使用者来说,这是一个很好的解决方案,对于最初的问题也是一个很好的答案。但是在一个更普遍的背景下,人们不能总是接受文化偏见的假设“所有非 ASCII 都是坏的。”对于使用 non-ascii 但偶尔需要去掉它的上下文,Unicode 的肯定断言更适合。

当字符串的“ length”属性为正(非零) ,但看起来像(即打印为)一个空字符串时,可以很好地说明字符串中嵌入了零宽度的非打印字符。例如,我在 Chrome 调试器中显示了一个名为“ textContent”的变量:

> textContent
""
> textContent.length
7

这促使我想看看字符串中有什么。

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

这个字节序列似乎属于某些 Unicode 字符的家族,这些字符通过文字处理程序插入到文档中,然后找到进入数据字段的方式。最常见的是,这些符号出现在文档的末尾。零宽度空间 "%E2%80%8B"可以由 CK 编辑器(CKEditor)插入。

encodeURI()  UTF-8     Unicode  html     Meaning
-----------  --------  -------  -------  -------------------
"%E2%80%8B"  EC 80 8B  U 200B   &#8203;  zero-width-space
"%E2%80%8E"  EC 80 8E  U 200E   &#8206;  left-to-right-mark
"%E2%80%8F"  EC 80 8F  U 200F   &#8207;  right-to-left-mark

以下是一些参考资料:

Http://www.fileformat.info/info/unicode/char/200b/index.htm

Https://en.wikipedia.org/wiki/left-to-right_mark

注意,虽然嵌入字符的编码是 UTF-8,但正则表达式中的编码不是。虽然字符以三个字节(在我的例子中)的 UTF-8嵌入在字符串中,但是正则表达式中的指令必须使用两个字节的 Unicode。事实上,UTF-8可以长达4个字节; 它不如 Unicode 紧凑,因为它使用高位(或位)来转义标准的 ascii 编码。这里有解释:

Https://en.wikipedia.org/wiki/utf-8

这些答案都不能正确处理制表符、换行符、回车符,有些答案不能处理扩展的 ASCII 和 unicode。 这将保持制表符和换行符,但删除控制字符和 ASCII 集以外的任何东西。单击“运行此代码段”按钮进行测试。将来(2020 + ?)会有一些新的 javascript 出现你可能必须做 \u{FFFFF},但不是现在

console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))

str = str.replace(/[\u{0080}-\u{10FFFF}]/gu,"");