随笔-1  评论-1  文章-0  trackbacks-0
  2005年11月3日

       众所周知,XML的快速发展,已经越来越多地出现在数据交互、文件配置和格式化的数据载体中,尽管XML支持的语言越来越多,但是还是有些字符是不被支持的。我在工作中就遇到了这样的问题,通过.csv文件录入数据,然后通过在程序中转化为XML中间文件,再将XML文件录入进行处理时发生异常,经过分析,是由于.csv文件中含有XML不支持的非法字符。

       查询XML规范(http://www.w3.org/TR/2004/REC-xml-20040204),得知:XML支持的字符范围:

Character Range

[2]   

Char

   ::=   

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

 

 

从字符串中检测XML不支持的字符的Java代码:

  1public static int checkCharacterData(String text){
  2
  3        int errorChar=0;
  4
  5        if (text == null{
  6
  7            return errorChar;
  8
  9        }

 10
 11        // do check
 12
 13        char[] data = text.toCharArray();
 14
 15        for (int i = 0, len = data.length; i < len; i++{
 16
 17            char c = data[i];
 18
 19            int result = c;
 20
 21            // high surrogate
 22
 23            if (result >= 0xD800 && result <= 0xDBFF{
 24
 25                // Decode surrogate pair
 26
 27               int high = c;
 28
 29               try {
 30
 31                 int low = text.charAt(i+1);
 32
 33                 if (low < 0xDC00 || low > 0xDFFF{
 34
 35                    char ch=(char)low;
 36
 37                    //System.err.println(ch);
 38
 39                 }

 40
 41                 // Algorithm defined in Unicode spec
 42
 43                 result = (high-0xD800)*0x400 + (low-0xDC00+ 0x10000;
 44
 45                 i++;
 46
 47               }

 48
 49               catch (IndexOutOfBoundsException e) {
 50
 51                   e.printStackTrace();
 52
 53               }

 54
 55            }

 56
 57 
 58
 59            if (!isXMLCharacter(result)) {
 60
 61                // Likely this character can't be easily displayed
 62
 63                // because it's a control so we use its hexadecimal
 64
 65                // representation in the reason.
 66
 67                errorChar++;
 68
 69            }
      
 70
 71        }

 72
 73        // If we got here, everything is OK
 74
 75        return errorChar;
 76
 77    }

 78
 79 
 80
 81    
 82
 83    private static boolean isXMLCharacter(int c) {
 84
 85         if (c <= 0xD7FF)  {
 86
 87             if (c >= 0x20return true;
 88
 89             else {
 90
 91                  if (c == '\n'return true;
 92
 93                  if (c == '\r'return true;
 94
 95                  if (c == '\t'return true;
 96
 97                  return false;
 98
 99             }

100
101         }

102
103 
104
105         if (c < 0xE000return false;  if (c <= 0xFFFDreturn true;
106
107         if (c < 0x10000return false;  if (c <= 0x10FFFFreturn true;
108
109       
110
111         return false;
112
113    }

114
posted @ 2005-11-03 13:39 Jered 阅读(1521) | 评论 (1)编辑 收藏
仅列出标题