删除字符串中的非ascii字符

时间:2013-12-31 10:55:06

标签: javascript non-ascii-characters

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

我需要从字符串中删除所有非ascii字符,

表示str只包含" INFO](Higashikurume)&#34 ;;

7 个答案:

答案 0 :(得分:182)

ASCII的范围是0到127,所以:

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

答案 1 :(得分:18)

也可以通过正面断言来完成,如下所示:

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

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

我称之为"正面断言"从某种意义上讲,这是一个积极的"断言表示要删除哪些字符,而#34;否定"断言表示哪些字母不删除。在许多情况下,如先前答案中所述,否定主张可能对读者更具启发性。旋律" ^"说"不是"范围\x00-\x7F表示" ascii,"所以两人一起说'#34;不是ascii。"

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

对于只关心英语的英语使用者而言,这是一个很好的解决方案,对于原始问题也是一个很好的答案。但是在更一般的背景下,人们不能总是接受假设的文化偏见"所有非ascii都是坏的。"对于使用非ascii但偶尔需要删除的上下文,Unicode的正面断言更适合。

一个很好的迹象表明字符串中嵌入了零宽度,非打印字符,这是字符串" s"长度"属性为正(非零),但看起来像(即打印为)空字符串。例如,我在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编码。这里解释了:

https://en.wikipedia.org/wiki/UTF-8

答案 2 :(得分:13)

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

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

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

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

答案 3 :(得分:2)

使用带重音符号的ASCII:

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

答案 4 :(得分:2)

这些答案均不能正确处理制表符,换行符,回车符,并且某些不能处理扩展的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-\uFFFF]/g, ''))

答案 5 :(得分:0)

快速Google搜索会在StackOverflow上返回这篇文章:

trim non-ascii characters from string returned by nodejs crypto

我不会赞同答案,但是,您可以使用此正则表达式替换非ascii字符:

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

答案 6 :(得分:0)

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