Java:检测对JSON不正确的控制字符

Bry*_*eld 15 java unicode json control-characters

我正在重新发明轮子并在Java中创建自己的JSON解析方法.

我要去json.org上的(非常好的!)文档.我不确定的唯一部分是它所说的"或控制性格"

由于文档非常清晰,并且JSON非常简单易于实现,我认为我会继续并且需要规范而不是松散.

我如何正确地删除Java中的控制字符?也许有一个unicode系列?

在此输入图像描述


编辑:A(通常?)错过了拼图

被告知在定义的范围 1 2之外还有其他控制字符可能在<script>标签中很麻烦.

最值得注意的是字符U + 2028和U + 2029,线和段落分隔符,它们充当换行符.在字符串文字的中间注入换行符很可能会导致语法错误(未终止的字符串文字).3

虽然我认为这不会造成XSS威胁,但在<script>标签中添加额外的规则仍然是一个好主意.

  • 只需简单并使用\u符号编码所有非"ASCII可打印"字符.这些角色开始时并不常见.如果您愿意,可以添加到白名单,但我建议使用白名单方法.
  • 如果你不知道,不要忘记</script(不区分大小写),这可能会导致HTML脚本注入到您的网页与人物</script><script src=http://tinyurl.com/abcdef>.默认情况下,这些字符都不是以JSON编码的.

Dil*_*nga 7

Character.isISOControl(...)吗?顺便提一下,UTF-16是Unicode代码点的编码......您是要在字节级别,还是在字符/代码点级别进行操作?我建议将UTF-16的映射保留到Java核心API的字符流中......

  • @George:嗯,文档说*"如果一个字符的代码在''\ u0000'`到''\ u001F'`或''\ u007F'的范围内,则它被认为是ISO控制字符.通过''\ u009F'`"*因为它与我控制的Unicode控制字符的定义相匹配,我会说@Dilum是赢家... :-)(虽然我是我的迂腐,但我会可能想找到一个参考,说两者真的是联系在一起的,所以如果一个改变了,我不必担心它们会失去同步.)但这可能是迂腐. (2认同)

jar*_*bjo 6

即使它不是非常具体,我也会假设它们引用了Unicode规范中的"控制"字符类别.

在Java中,您可以c使用以下表达式检查字符是否为Unicode控制字符:Character.getType(c) == Character.CONTROL.


too*_*ges 5

我知道这个问题几年前就被问过,但我还是要回复,因为接受的答案不正确。

Character.isISOControl(int codePoint) 
Run Code Online (Sandbox Code Playgroud)

执行以下检查:

(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);
Run Code Online (Sandbox Code Playgroud)

JSON 规范定义于https://www.rfc-editor.org/rfc/rfc7159

  1. 弦乐

字符串的表示形式与 C 系列编程语言中使用的约定类似。字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。

Character.isISOControl(int codePoint) 
Run Code Online (Sandbox Code Playgroud)

将标记所有需要转义的字符(U+0000-U+001F),尽管它也会标记不需要转义的字符(U+007F-U+009F)。不需要转义字符(U+007F-U+009F)