在接受、存储、处理和显示 Unicode 文本的应用程序中(为了讨论的目的,我们假设它是一个 Web 应用程序),应该始终从中删除哪些字符传入文本?
我能想到一些,大部分列在 C0 and C1 control codes Wikipedia article 中:
范围
0x00
-0x19
(主要是控制字符),不包括0x09
(制表符)、0x0A
(LF) 和0x0D
(CR)范围
0x7F
-0x9F
(更多控制字符)
最好知道可以安全接受的字符范围。
还有其他级别的文本过滤 - 可以规范化具有多种表示形式的字符、替换不间断字符以及删除零宽度字符 - 但我主要对基础知识感兴趣。
最佳答案
参见 W3 Unicode in XML and other markup languages笔记。它将一类字符定义为“不鼓励在标记中使用”,我肯定会在大多数网站上过滤掉这些字符。它特别包括以下字符:
U+2028–9 是时髦的换行符,如果您尝试在字符串文字中使用它们,它们会使 JavaScript 感到困惑;
U+202A–E,这是双向控制代码,狡猾的用户可以插入这些代码,以使文本在某些浏览器中看起来是向后运行的,甚至在给定 HTML 元素之外也是如此;
语言覆盖控制代码也可能具有元素之外的范围;
Material list 。
此外,您可能希望过滤/替换在 Unicode 中根本无效的字符(U+FFFF 等),并且如果您使用的是原生支持 UTF-16 的语言(例如 Java) 、Windows 上的 Python)、任何不形成有效代理对的代理字符 (U+D800–U+DFFF)。
The range 0x00-0x19 (mostly control characters), excluding 0x09 (tab), 0x0A (LF), and 0x0D (CR)
并且可以说(特别是对于 Web 应用程序),也会丢失 CR,并将制表符变成空格。
The range 0x7F-0x9F (more control characters)
是的,远离这些,除非人们可能真的这么想。 (SO 曾经允许它们,这允许人们发布被错误解码的字符串,这有时对于诊断 Unicode 问题很有用。)对于大多数网站,我认为你不会想要它们。
关于string - 最低限度的文本清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197639/