如何从字符串中删除控制字符?

32

我在页面上有一个表单,用户可以输入一些文本并提交。然后将文本发送到服务器(基于node.js的REST API)并保存到数据库(postgres)中。

问题是偶尔会保存一些奇怪的字符(控制字符),例如换码控制字符(^ [)或退格控制字符(^ H)。通常不会破坏任何东西,因为这些字符是看不见的,所以HTML呈现正确。但是,当我为RSS阅读器提供XML内容时,它们(阅读器)因为这些控制字符返回“格式不正确的XML”,删除它们之后才能正常工作。

我的问题是如何在客户端级别(javascript)或服务器级别(javascript / node.js)从字符串中去除这些字符?


1
只需要做什么呢?拿到字符串,使用字符串替换函数将任何非法字符(或字符范围)替换为'',然后保存即可。 - Mike 'Pomax' Kamermans
请查看此主题 https://dev59.com/a2855IYBdhLWcg3wYjOF - Asik
请使用CDATA将此类数据包装起来。 - Vasiliy vvscode Vanchuk
我的RSS订阅中的所有字符串字段都被CDATA包装,但这并没有解决问题 - 仍然会出现“格式不正确的XML”错误。 - user606521
1
我认为这并没有涵盖所有可能会破坏事物的字符。例如,0x200B是一个无声的杀手 - 参见此处https://dev59.com/IGcs5IYBdhLWcg3wmlIK。 - mike nelson
1
这是一个所有可能被普通空格替换的空格字符列表 https://www.cs.tut.fi/~jkorpela/chars/spaces.html,还指出了应该删除的两个不可见空格字符。 - mike nelson
2个回答

47

在Unicode中,控制字符的代码点范围为U+0000到U+001F和U+007F到U+009F。使用RegExp查找这些控制字符,并用空字符串替换:

str.replace(/[\u0000-\u001F\u007F-\u009F]/g, "")

如果你想要移除额外的字符,需要将这些字符添加到 RegExp 中的 字符类 内部。例如,如果要移除 U+200B 零宽空格,需要在 ] 的前面添加 \u200B


这是一个“治疗”别名“药物” - 那么“预防”呢? - Bekim Bacaj
4
请转告那些从Microsoft Word中复制粘贴文本的人,谢谢@BekimBacaj :) - iwanuschka
我发现iOS在自动完成时存在问题,对于使用多种语言的用户,会插入从右到左标记Unicode字符,其十六进制代码为> 0x200F,HTML代码为> ‏ - bnns
3
我尝试更全面地使用以下代码: str.replace(/[\u0000-\u001F\u007F-\u009F\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g, ""); - bnns

-6
我曾经遇到类似的问题,这是我选择的解决方案。
我使用encodeURIComponent(variable_Name)对用户输入的字符串数据进行编码,然后在显示时使用decodeURIComponent(variable_Name)进行解码。

4
由于 encodeURI.. 只是对控制字符进行编码,而 decodeURI.. 则是将它们解码回来,因此这种方法行不通。 - user606521
谢谢您的评论,能否请您解释一下,为什么编码和解码不起作用? - Mateen
3
因为它只是对不可见字符进行编码,然后再解码,实际上并没有任何变化 - 我的内容中仍然会有这些不可见字符 - 我希望从内容中将它们删除... - user606521
实际上,encodeURIComponent方法将几乎所有符号编码为它们的HTML等效代码,例如:var uri = "@#$%^&*()_+-={}[]|:;'<>?,./"; var res = encodeURIComponent(uri);输出:%40%23%24%25%5E%26*()_%2B-%3D%7B%7D%5B%5D%7C%3A%3B'%3C%3E%3F%2C.%2F因此,一旦特殊符号被编码,就不会出现任何问题,并且我们可以在解码后看到实际值。 - Mateen
1
但我想要删除这些字符,而不是对它们进行编码(例如博客文章描述中不需要“转义”或“退格”字符)。而且我不能将编码后的内容提供给RSS源,因为其中有一些HTML代码,而encodeURIComponent会对其进行编码,导致在RSS源中看到HTML标签。 - user606521
无论如何,我很高兴你找到了答案。对于上述声明,我想说的是:如果您对用户提供的值进行编码,然后再进行解码(也可以从服务器端完成),那么用户的值将与他所提供的值相同。编码和解码总是让我免受特殊字符的负担。 - Mateen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接