说明:项目里webservice借口上传数据出异常 日志打印报错类似于标题那种。开始的解决方法是JS正则去掉非汉字、数字、英文、标点符号。后来上网查了下找到下述解决方法。
--------------------分割线---------------------------------
以下内容转自:
java做WebService接口上传数据,传输格式利用XML来传输。
XML不支持Unicode编码的字符串。会导致如下问题:
the char 'ox1e' after '' is not a valid xml character解决方法是过滤字符串里的 'ox1e' ./*去掉XML 不认可的字符0x0-0x20*/ //0x1epublic static String DECODE(String in) { StringBuffer out = new StringBuffer(); // Used to hold the output. char current; // Used to reference the current character. if (in == null || ("".equals(in))) return ""; // vacancy test. for (int i = 0; i < in.length(); i++) { current = in.charAt(i); if(current == 0x1e){ System.out.println("出现错误编码...捕获...过滤....-->current:" + current); }else if((current == 0x9) || (current == 0xA) || (current == 0xD) || ((current > 0x20) && (current <= 0xD7FF)) || ((current >= 0xE000) && (current <= 0xFFFD)) || ((current >= 0x10000) && (current <= 0x10FFFF))||(current < 0x0)) out.append(current); } return out.toString().trim();}
2011.07.05
事隔一年,以上问题在几个省份的WebService接口中相继出现,这次一同事查找到了也较全面的资料,记载如下:
XML 容许的字符 请看 http://www.w3.org/TR/REC-xml#dt-character 。
0x9, 0xA, 0xD,其中0x9代表Tab键的16进制代码,0xA, 0xD代表16进制的回车符与换行符.可以用UE在正常模式下敲回车,然后点击16进制查看模式查看出来。
***,你好 与你确认一件事情,0x9, 0xA, 0xD等代码中IF条件里的字符都是不去掉的,之外的字符是要去掉的吧? 2011-07-04 ----------------------------------
原邮件附件清单如下: (1). 湖南数据问题.doc (2). Util.java (3). 对XML_进行_parse_时的Invalid_Unicode_character_(0x0)_分析.docx***,你好!
江苏上传集团BDC接口中处理特殊字符的代码如下:
/* 去掉XML不认可的字符0x0-0x20 */
public String decode(String in) { StringBuffer out = new StringBuffer(); // Used to hold the output. char current; // Used to reference the current character. if (in == null || ("".equals(in))) return ""; // vacancy test. for (int i = 0; i < in.length(); i++) { current = in.charAt(i); if ((current == 0x9) || (current == 0xA) || (current == 0xD) || ((current > 0x20) && (current <= 0xD7FF)) || ((current >= 0xE000) && (current <= 0xFFFD)) || ((current >= 0x10000) && (current <= 0x10FFFF)) || (current < 0x0)) out.append(current); } return out.toString().trim(); }
处理的规则就是将字符中含有的0x9, 0xA, 0xD, 0x20, 0xD7FF, 0xE000, 0xFFFD, 0x10000, 0x10FFFF, 0x0这些XML解析时无效的编码字符去除掉。
接口程序中只有个别字段的内容调用了该方法进行处理,是否只需要处理这些字段?还是全部手动输入的字段都要调用该方法处理一下?请本地确认。
这个问题最早在2009年12月30日集团处理湖南数据上传的时候就出现过,下面邮件及附件《湖南数据问题.doc》是当时排查的情况,供参考。
经过网络搜索对该问题的原因做如下总结:
因为字节数组中存在 Unicode: 0x0,而这个字节在Xml中被认为是非法字符。对于一些经过编码或加、解密的字符串中,很容易会出现这个 0x0,特别是在加、解密中,经常会涉及到字符填充,而填充物通常是 0x0,对于0x00-0x20 都会引起一定的问题,又因为这些字符不可见,因此用通常的编辑器进行编辑的时候找不到问题所在。
xml中需要过滤的字符分为两类:
一类是不允许出现在xml中的字符,这些字符不在xml的定义范围之内;
另一类是xml自身要使用的字符,如果内容中有这些字符则需被替换成别的字符。
第一类字符:
对于第一类字符,我们可以通过W3C的XML文档来查看都有哪些字符不被允许出现在xml文档中。
XML允许的字符范围是“#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]”。因此我们可以把这个范围之外的字符过滤掉。
第二类字符:
对于第二类字符一共有5个,如下:
字符 HTML字符 字符编码
和(and) & & &
单引号 ’ ' '
双引号 ” " "
大于号 > > >
小于号 < < <
附件中《对XML_进行_parse_时的Invalid_Unicode_character_(0x0)_分析.docx》是在百度文库中搜索到的供参考。
-------------------------分割线------------------------------------------------------------------------------------
PS:仅供参考