非法字符 - CTRL-CHAR

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非法字符 - CTRL-CHAR相关的知识,希望对你有一定的参考价值。

我从Web服务获得以下异常:

com.ctc.wstx.exc.WstxUnexpectedCharException:非法字符((CTRL-CHAR,代码15))

我知道这背后的原因,我想要返回的数据中有“控制字符”。并且在xml中不允许使用CTRL-CHAR。

我搜索了解决方案,很多地方我找到了删除CTRL-CHAR的代码。

如果我从数据中删除控制字符,我最终会担心数据丢失吗?我想清洁解决方案可能编码。而不是删除控制字符。

答案

我会做OrangeDog建议的。但是如果你想在你的代码中解决它,请尝试:

replaceAll("[\x00-\x09\x11\x12\x14-\x1F\x7F]", "")

\x12是char。

问候。

另一答案

Woodstox XML解析器抛出此错误。 InputBootstrapper类的源代码如下所示:

protected void reportUnexpectedChar(int i, String msg)
    throws WstxException
{
    char c = (char) i;
    String excMsg;

    // WTF? JDK thinks null char is just fine as?!
    if (Character.isISOControl(c)) {
        excMsg = "Unexpected character (CTRL-CHAR, code "+i+")"+msg;
    } else {
        excMsg = "Unexpected character '"+c+"' (code "+i+")"+msg;
    }
    Location loc = getLocation();
    throw new WstxUnexpectedCharException(excMsg, loc, c);
}

除了有趣的评论之外,Woodstox还在JDK解析器之上执行了一些额外的验证,并拒绝将ASCII字符15视为无效。

至于为什么那个角色在那里,我们不能告诉你,它在你的数据中。同样,我们无法告诉你,删除该字符是否会破坏任何内容,因为再次,这是你的数据。你只能为自己建立。

另一答案

谢谢你的投入。我分享解决方案可能对其他人有帮助。要求不是消除CONTROL CHAR,它应该保留在DB中,并且一个WS通过n / w客户端发送它应该能够获得CONTROL CHAR。所以我实现了如下代码:

  1. 使用Web服务代码中的URLEncoder对字符串进行编码。
  2. 在客户端使用URLDecoder对其进行解码

共享示例代码和输出。 示例代码:

System.out.println("NewSfn");  
System.out.println(URLEncoder.encode("NewSfn", "UTF-8"));  
System.out.println(URLDecoder.decode("NewSfn", "UTF-8"));  

输出:

NewSfn  
New%0FSfn  
NewSfn 

因此客户将收到CONTROL CHAR。

编辑:Stack Exchange未显示上面的CONTROL CHAR。 NewSfn就像这个New(CONTROL CHAR)Sfn

另一答案

如果文本数据中有控制字符,则需要从源头解决该问题。

最可能的原因是不正确的通信编码(通常在数据库和应用程序之间)或不清理用户输入。

另一答案

当我为某些参数传递空值时,我发现了同样的问题。我通过了空值或扳手值而这个错误消失了。

另一答案

我对@ ssedano的anwser感到有点困惑,在我看来,他试图从ASCII表0x00到0x1F找到所有控制字符,除了0x0A(换行)和0x0D(回车)加上0x7F(del),然后就是'正则表达式

replaceAll("[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]", "")

以上是关于非法字符 - CTRL-CHAR的主要内容,如果未能解决你的问题,请参考以下文章

我的javascript片段返回“非法字符”

索引1处片段中的非法字符:Heroku上的#{systemEnvironment ['DATABASE_URL']}配置数据源

【已解决】Illegal character ((CTRL-CHAR, code 31)) 排查解决

Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included

模型衍生 API 响应未通过 Jackson 映射

关闭从另一个对话框片段启动的对话框片段会导致非法状态异常