关于java调用webservice异常 the char 'ox1e' after '' is not a valid xml character

来源:互联网 发布:直播特效软件 编辑:程序博客网 时间:2024/04/30 12:15

说明:项目里webservice借口上传数据出异常 日志打印报错类似于标题那种。开始的解决方法是JS正则去掉非汉字、数字、英文、标点符号。后来上网查了下找到下述解决方法。

--------------------分割线---------------------------------

以下内容转自:http://hi.baidu.com/godtrip/item/90c1a4eec422eb0d560f1d8a

java做WebService接口上传数据,传输格式利用XML来传输。

XML不支持Unicode编码的字符串。会导致如下问题:
the char 'ox1e' after '' is not a valid xml character

解决方法是过滤字符串里的 'ox1e' .

/*去掉XML 不认可的字符0x0-0x20*/ //0x1e

复制代码
public 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) &        &amp;               &#38;

  单引号  ’       &apos;              &#39;

  双引号  ”       &quot;              &#34;

  大于号  >        &gt;                &#62;

  小于号  <        &lt;                &#60; 

    附件中《对XML_进行_parse_时的Invalid_Unicode_character_(0x0)_分析.docx》是在百度文库中搜索到的供参考。

-------------------------分割线------------------------------------------------------------------------------------

PS:仅供参考

原创粉丝点击