Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:检测对JSON不正确的控制字符_Java_Json_Unicode_Control Characters - Fatal编程技术网

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

Java:检测对JSON不正确的控制字符,java,json,unicode,control-characters,Java,Json,Unicode,Control Characters,我正在重新发明轮子,并用Java创建自己的JSON解析方法 我要看上的(非常好!)文档。我唯一不确定的部分是它在哪里显示“或控制字符” 由于文档是如此清晰,JSON是如此简单和易于实现,我想我会继续要求规范,而不是松散 如何正确地去除Java中的控制字符?也许有一个unicode范围 编辑:一个(通常?)缺失的拼图 我知道在标记中,除此之外还有其他控制字符可能会带来麻烦 最明显的是字符U+2028和U+2029,行和段分隔符,用作换行符。在字符串文字的中间插入换行符很可能会导致语法错误(未终

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

我要看上的(非常好!)文档。我唯一不确定的部分是它在哪里显示“或控制字符”

由于文档是如此清晰,JSON是如此简单和易于实现,我想我会继续要求规范,而不是松散

如何正确地去除Java中的控制字符?也许有一个unicode范围


编辑:一个(通常?)缺失的拼图 我知道在
标记中,除此之外还有其他控制字符可能会带来麻烦

最明显的是字符U+2028和U+2029,行和段分隔符,用作换行符。在字符串文字的中间插入换行符很可能会导致语法错误(未终止的字符串文字)

虽然我相信这不会对XSS造成威胁,但添加额外的规则用于
标记仍然是一个好主意

  • 简单一点,用
    \u
    符号对所有非“ASCII可打印”字符进行编码。这些角色一开始并不常见。如果您愿意,您可以添加到白名单中,但我建议使用白名单方法

  • 如果您不知道,请不要忘记关于
    的内容,即使它不是非常具体,我假设它们引用了Unicode规范中的

    在Java中,您可以使用以下表达式检查字符
    c
    是否是Unicode控制字符:
    character.getType(c)==character.control
    可以吗?顺便说一句,UTF-16是Unicode码点的编码。。。您是要在字节级操作,还是在字符/代码点级操作?我建议保留从UTF-16到字符流到Java核心API的映射…

    我认为:

    U+0000..U+001F和U+007F..U+009F范围内的65个字符


    这是他们对控制代码的定义,但上面是一句“也称为控制字符”。所以…

    我知道几年前有人问过这个问题,但我还是要回答,因为公认的答案是不正确的

    Character.isISOControl(int codePoint) 
    
    是否执行以下检查:

    (codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);
    

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

    Unicode是Unicode。UTF-16是一种编码。我认为Java有Unicode分组的测试?请参阅一些序言和其他有趣的函数。我的意思是,Java字符串中的每个字符都是两个字节。即使数据是ASCII码,当转换成字符串时,每个字符串也有两个字节。“对于那些不知道的人来说,Java使用UTF-16字符进行操作。”嗯,是的,有点像。Java的
    String
    类型在内部以UTF-16存储字符串数据,但Java非常乐意使用其他编码(包括UTF-8或Windows-1252——两者都常用——和UTF-32)进行读写。也许值得从这里开始:别担心,我理解字符串编码,即使我没有正确描述它。我是在字符级别操作的。在JSON解析开始之前,字节被转换为字符串。我不知道
    isISOControl
    是否正确。我知道可以,因为这不需要严格正确。:)@乔治:嗯,文档上说“如果一个字符的代码在
    '\u0000'
    '\u001F'
    的范围内,或者在
    '\u007F'
    '\u009F'
    的范围内,则该字符被视为ISO控制字符。”因为这与我链接到的Unicode控制字符的定义相匹配,我会说@Dilum是赢家…:-)(虽然我是个书呆子,但我可能想找到一个证明,说这两者确实是联系在一起的,这样如果其中一个发生了变化,我就不必担心它们会不同步。)但这可能是书呆子。@t.J.:+1给你和jarnbjo。接受Dilum的答案,因为我最终使用了它。@George:完全合理!:-)
    Character.isISOControl(int codePoint)