Java 非法字符-CTRL-CHAR

Java 非法字符-CTRL-CHAR,java,xml,web-services,character-encoding,Java,Xml,Web Services,Character Encoding,我从webservices获得以下例外消息: com.ctc.wstx.exc.WstxUnexpectedCharException:非法字符CTRL-CHAR,代码15 我知道这背后的原因,我得到了我想要返回的数据中的控制字符。 在xml中,不允许使用CTRL-CHAR 我搜索了解决方案,在许多地方找到了删除CTRL-CHAR的代码 问题是,如果从数据中删除控制字符,是否会导致数据丢失? 我要干净的溶液。Woodstox XML解析器将引发此错误,而不是删除控制字符。。InputBootst

我从webservices获得以下例外消息:

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

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

我搜索了解决方案,在许多地方找到了删除CTRL-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作为无效字符


至于为什么会有这个角色,我们不能告诉你,它在你的数据中。类似地,我们不能告诉您删除该字符是否会破坏任何内容,因为这也是您的数据。您只能为自己建立该问题。

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


最可能的原因是数据库和应用程序之间的通信编码不正确,或者没有清理用户输入。

我会按照OrangeDog的建议去做。但如果您想在代码中解决此问题,请尝试:

replaceAll[\\x00-\\x09\\x11\\x12\\x14-\\x1F\\x7F]


\\x12是字符。

谢谢大家的支持。我分享的解决方案可能对其他人有所帮助。 要求不是清除控制字符,它也应该保持在数据库中的原样,一个WS通过n/w客户端发送它应该能够获得控制字符。因此,我实现了如下代码:

在Web服务代码中使用URLEncoder对字符串进行编码。 在客户端,使用URL解码器对其进行解码 下面分享示例代码和输出。 示例代码:

输出:

所以客户端将接收控制字符


编辑:堆栈交换未显示上面的控件字符。NewSfn类似于NewCONTROL CHARSfn。

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

我对@ssedano的anwser有点困惑,在我看来,他试图找到ASCII表0x00到0x1F中的所有控制字符,除了0x0A新行和0x0D回车符加上0x7F del,那么正则表达式不是吗

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

如果发送二进制数据,则不应使用xml。@sarnold:它是十进制的,忘记添加有关它的信息。@OrangeDog:我不是发送二进制数据,我是从数据库返回纯文本。不知道怎么做,但里面有控制字符。然后你需要定位并修复这个问题,而不是在另一层中掩盖这个问题。在我的例子中,输入key symbol from DB data to sent jax ws server。如果使用URLEncoder.encodeDB_输入,UTF-8,则可以正常工作;URLEncoder.decodeDB_输出,UTF-8;不丢失数据。有单独的字符可用于表示控制字符,以便于说明。在你的情况下是这样的␏.请看问题:我想要干净的解决方案…而不是删除控制字符。也请参见公认的答案。因此,这并不能回答问题。有了更多的声誉,你可以评论或编辑你所指的其他答案。或者,甚至在同样的基础上否决它。
NewSfn  
New%0FSfn  
NewSfn 
replaceAll("[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F]", "")