[英]Remove non-ascii character in string
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
我需要从字符串中删除所有非ascii字符,
意味着str只包含“INFO](Higashikurume)”;
ASCII的范围是0到127,所以:
str.replace(/[^\x00-\x7F]/g, "");
它也可以通过正面的删除声明来完成,如下所示:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
这使用unicode。 在Javascript中,当表达正则表达式的unicode时,字符用转义序列\\u{xxxx}
指定,但标志'u'
必须存在; 注意正则表达式有标志'gu'
。
我称这是一个“正面的删除断言”,意思是“正面”断言表示要删除哪些字符,而“否定”断言则表示哪些字母不能删除。 在许多情况下,如先前答案中所述,否定主张可能对读者更具启发性。 \\x00-\\x7F
“ ^
”表示“不”,范围\\x00-\\x7F
表示“ascii”,因此两者一起说“不是ascii”。
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
对于只关心英语的英语使用者而言,这是一个很好的解决方案,对于原始问题也是一个很好的答案。 但在更一般的背景下,人们不能总是接受假设“所有非ascii都不好”的文化偏见。 对于使用非ascii但偶尔需要删除的上下文,Unicode的正面断言更适合。
字符串中嵌入零宽度非打印字符的一个很好的指示是当字符串的“长度”属性为正(非零)时,但看起来像(即打印为)空字符串。 例如,我在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字符的族,它们被字处理器插入到文档中,然后进入数据字段。 最常见的是,这些符号出现在文档的末尾。 CK-Editor(CKEditor)可以插入零宽度空间"%E2%80%8B"
。
encodeURI() UTF-8 Unicode html Meaning
----------- -------- ------- ------- -------------------
"%E2%80%8B" EC 80 8B U 200B ​ zero-width-space
"%E2%80%8E" EC 80 8E U 200E ‎ left-to-right-mark
"%E2%80%8F" EC 80 8F U 200F ‏ 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编码。 这在这里解释:
您可以使用以下正则表达式替换非ASCII字符
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
但请注意,空格,冒号和逗号都是有效的ASCII,因此结果将是
> str
"INFO] :, , , (Higashikurume)"
要使用带重音的ASCII:
var str = str.replace(/[^\x00-\xFF]/g, "");
这些答案都没有正确处理选项卡,换行符,回车符,有些不处理扩展的ASCII和unicode。 这将保留选项卡和换行符,但删除控制字符和ASCII集之外的任何内容。 单击“运行此代码段”按钮进行测试。 有一些新的javascript下来管道,所以在未来(2020+?)你可能不得不做\\u{FFFFF}
但还没有
console.log("line 1\\nline2 \\n\\ttabbed\\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\\x00-\\x08\\x0E-\\x1F\\x7F-\]/g, ''))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.