在接受,存储,处理和显示Unicode文本的应用程序中(出于讨论的目的,假设它是一个Web应用程序),应该始终删除哪些字符来文?
我可以想到一些,主要列在C0 and C1 control codes Wikipedia article:
中范围0x00
- 0x19
(主要是控制字符),不包括0x09
(标签),0x0A
(LF)和0x0D
(CR)
范围0x7F
- 0x9F
(更多控制字符)
可以安全地接受的字符范围会更好地了解。
还有其他级别的文本过滤 - 可以规范化具有多个表示的字符,替换不间断字符和删除零宽度字符 - 但我主要对基础知识感兴趣。
答案 0 :(得分:1)
请参阅W3 Unicode in XML and other markup languages注释。它将一类字符定义为“不鼓励在标记中使用”,我肯定会过滤掉大多数网站。它特别包括以下字符:
U + 2028-9这些时髦的换行符如果你试图在字符串文字中使用它们会混淆JavaScript;
U + 202A-E是双向控制代码,狡猾的用户可以插入以使文本看起来在某些浏览器中向后运行,甚至在给定的HTML元素之外;
语言覆盖控制代码,也可以在元素之外具有范围;
BOM。
此外,你想要过滤/替换Unicode中无效的字符(U + FFFF等),并且,如果你使用的是一种本地使用UTF-16的语言(例如Java) ,Windows上的Python),任何不构成有效代理对的代理字符(U + D800-U + DFFF)。
范围0x00-0x19(主要是控制字符),不包括0x09(制表符),0x0A(LF)和0x0D(CR)
可以说(尤其是Web应用程序),也会丢失CR,并将标签转换为空格。
范围0x7F-0x9F(更多控制字符)
是的,远离那些,除非人们可能真的是指他们。 (过去常常允许人们发布错误解码的字符串,这对于诊断Unicode问题偶尔有用。)对于大多数网站,我认为你不需要它们。
答案 1 :(得分:0)
我想这取决于你的目的。在UTF-8中,你可以将用户限制为键盘字符,如果这是你的心血来潮,即9,10,13,[32-126]。如果您使用的是UTF-8,则0x7f +范围表示您具有多字节Unicode字符。在ASCII中,0x7f +包含特殊的显示/格式字符,并且根据位置的语言进行本地化以允许扩展。
请注意,在UTF-8中,键盘字符可能因位置而异,因为如果用户的语言不使用没有重音符号的拉丁语脚本,则用户可以使用其母语输入超出0x00-0x7f范围的字符(阿拉伯语,中文,日语,希腊语,Crylic等。)
如果你看一下here,就可以看到UTF-8中会显示哪些字符。