首页 » 编程笔记 » java » 正文

xml文件中过滤不可见字符(全)

最近在生成xml之后用浏览器打开会报以下的错误
屏幕快照 2018-01-11 上午10.53.09

This page contains the following errors:
error on line 1009 at column 8593: Input is not proper UTF-8, indicate encoding !
Bytes: 0×06 0×20 0x5D 0x5D
Below is a rendering of the page up to the first error.

查找了下资料 原因是因为xml中存在不可见字符,这些字符是ascii 的控制字符

xml的规范是不支持这些字符的

#x0 – #x8 (ASCII 08)

#xB - #xC (ASCII 1112)

#xE - #x1F (ASCII 1431)

参看文档:https://support.microsoft.com/en-us/kb/315580

所说的“不可见字符”,其实属于ascii码中的控制字符,它们是0到31、以及127,分别代表什么可查询ascii码表。

解决办法 ,过滤掉这些字符

php 代码

/** 
 * 根据ascii码过滤控制字符 
 * @param type $string 
 */  
public static function special_filter($string)  
{  
 if(!$string) return '';  
  
 $new_string = '';  
 for($i =0; isset($string[$i]); $i++)  
 {  
  $asc_code = ord($string[$i]); //得到其asc码  
    
  //以下代码旨在过滤非法字符  
  if($asc_code == 9 || $asc_code == 10 || $asc_code == 13){  
   $new_string .= ' ';  
  }  
  else if($asc_code > 31 && $asc_code != 127){  
   $new_string .= $string[$i];  
  }  
 }  
  
 return trim($new_string);  
}  

java 代码

public static String filter(String content){
       if (content != null && content.length() > 0) {
          char[] contentCharArr = content.toCharArray();
          for (int i = 0; i < contentCharArr.length; i++) {
               if (contentCharArr[i] < 0x20 || contentCharArr[i] == 0x7F) {
                    contentCharArr[i] = 0x20;
               }
          }
          return new String(contentCharArr);
       }
       return "";
}

ASCII码对照表

屏幕快照 2018-01-11 上午11.03.13

屏幕快照 2018-01-11 上午11.03.22