非法字符 – CTRL-CHAR
我从webservices获得以下exceptopn:
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解析器之上执行了一些额外的validation,并拒绝将ASCII字符15
视为无效。
至于为什么那个角色在那里,我们不能告诉你,它在你的数据中。 同样地,我们无法告诉您删除该字符是否会破坏任何内容,因为再次,它是您的数据。 你只能为自己建立。
谢谢你的投入。 我分享解决方案可能对其他人有帮助。 要求不是消除CONTROL CHAR,它应该保留在DB中,并且一个WS通过n / w客户端发送它应该能够获得CONTROL CHAR。 所以我实现了如下代码:
- 使用Web服务代码中的URLEncoder对字符串进行编码。
- 在客户端使用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
。
如果文本数据中有控制字符,则需要从源头解决该问题。
最可能的原因是不正确的通信编码(通常在数据库和应用程序之间)或不清理用户输入。
当我为某些参数传递空值时,我发现了同样的问题。 我通过了空值或扳手值而这个错误消失了。