Java:检测对JSON不正确的控制字符
我正在重新发明轮子,并用Java创建自己的JSON解析方法 我要看上的(非常好!)文档。我唯一不确定的部分是它在哪里显示“或控制字符” 由于文档是如此清晰,JSON是如此简单和易于实现,我想我会继续要求规范,而不是松散 如何正确地去除Java中的控制字符?也许有一个unicode范围Java:检测对JSON不正确的控制字符,java,json,unicode,control-characters,Java,Json,Unicode,Control Characters,我正在重新发明轮子,并用Java创建自己的JSON解析方法 我要看上的(非常好!)文档。我唯一不确定的部分是它在哪里显示“或控制字符” 由于文档是如此清晰,JSON是如此简单和易于实现,我想我会继续要求规范,而不是松散 如何正确地去除Java中的控制字符?也许有一个unicode范围 编辑:一个(通常?)缺失的拼图 我知道在标记中,除此之外还有其他控制字符可能会带来麻烦 最明显的是字符U+2028和U+2029,行和段分隔符,用作换行符。在字符串文字的中间插入换行符很可能会导致语法错误(未终
编辑:一个(通常?)缺失的拼图 我知道在
标记中,除此之外还有其他控制字符可能会带来麻烦
最明显的是字符U+2028和U+2029,行和段分隔符,用作换行符。在字符串文字的中间插入换行符很可能会导致语法错误(未终止的字符串文字)
虽然我相信这不会对XSS造成威胁,但添加额外的规则用于
标记仍然是一个好主意
- 简单一点,用
符号对所有非“ASCII可打印”字符进行编码。这些角色一开始并不常见。如果您愿意,您可以添加到白名单中,但我建议使用白名单方法\u
- 如果您不知道,请不要忘记关于
的内容,即使它不是非常具体,我假设它们引用了Unicode规范中的 在Java中,您可以使用以下表达式检查字符
是否是Unicode控制字符:c
可以吗?顺便说一句,UTF-16是Unicode码点的编码。。。您是要在字节级操作,还是在字符/代码点级操作?我建议保留从UTF-16到字符流到Java核心API的映射…我认为: U+0000..U+001F和U+007F..U+009F范围内的65个字符character.getType(c)==character.control
这是他们对控制代码的定义,但上面是一句“也称为控制字符”。所以…我知道几年前有人问过这个问题,但我还是要回答,因为公认的答案是不正确的
是否执行以下检查:Character.isISOControl(int codePoint)
(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);
将标记所有需要转义的字符
,但也将标记不需要转义的字符(U+0000-U+001F)
。不需要转义字符(U+007F-U+009F)
Unicode是Unicode。UTF-16是一种编码。我认为Java有Unicode分组的测试?请参阅一些序言和其他有趣的函数。我的意思是,Java字符串中的每个字符都是两个字节。即使数据是ASCII码,当转换成字符串时,每个字符串也有两个字节。“对于那些不知道的人来说,Java使用UTF-16字符进行操作。”嗯,是的,有点像。Java的(U+007F-U+009F)
类型在内部以UTF-16存储字符串数据,但Java非常乐意使用其他编码(包括UTF-8或Windows-1252——两者都常用——和UTF-32)进行读写。也许值得从这里开始:别担心,我理解字符串编码,即使我没有正确描述它。我是在字符级别操作的。在JSON解析开始之前,字节被转换为字符串。我不知道String
是否正确。我知道可以,因为这不需要严格正确。:)@乔治:嗯,文档上说“如果一个字符的代码在isISOControl
到'\u0000'
的范围内,或者在'\u001F'
到'\u007F'
的范围内,则该字符被视为ISO控制字符。”因为这与我链接到的Unicode控制字符的定义相匹配,我会说@Dilum是赢家…:-)(虽然我是个书呆子,但我可能想找到一个证明,说这两者确实是联系在一起的,这样如果其中一个发生了变化,我就不必担心它们会不同步。)但这可能是书呆子。@t.J.:+1给你和jarnbjo。接受Dilum的答案,因为我最终使用了它。@George:完全合理!:-)'\u009F'
Character.isISOControl(int codePoint)