2010-02-08 96 views
2

在我的文本中有芬兰文字符(例如ä,ö和å),这些字符在XML中是不安全的,有没有用于此目的的任何库/框架?如何将不安全的字符转换为Java中安全字符的XML?

+4

我不认为我真的会称这些字符为“不安全”。字符编码必须正确,并匹配XML声明,就这些了。 – 2010-02-08 09:29:51

+1

显然,我的servlet响应没有response.setCharacterEncoding(“UTF-8”);但是当我添加它时,一切正常...... – newbie 2010-02-08 10:03:32

回答

3

XML支持Unicode,因此您唯一需要转义的就是五个基本的XML实体(gt,lt,quot,amp,apos)。如果您使用StringEscapeUtils.escapeXML,它会将您所有的ä,ö和å变成丑陋的\ uabcd内容。

+0

顺便说一句,有一些字符被XML规范视为非法,无论你如何编码它们。例如,ASCII NUL字符。 – 2010-02-08 11:49:49

2

所以最好的方法ecsape字符串的XML是StringEscapeUtils.escapeXML Commons Lang,但作为有人在这里已经表示,这是不够的 E.g.有一些不可打印的控制字符,如果想要有效的xml,应该从字符串中删除。 要做到这一点,我用这个片段:

/** 
* Function to strip control characters from a string. 
* Any character below a space will be stripped from the string. 
* @param iString the input string to be stripped. 
* @return a string containing the characters from iString minus any control characters. 
*/ 
public String stripControlChars(String iString) { 
    StringBuffer result = new StringBuffer(iString); 
    int idx = result.length(); 
    while (idx-- > 0) { 
     if (result.charAt(idx) < 0x20 && result.charAt(idx) != 0x9 && 
       result.charAt(idx) != 0xA && result.charAt(idx) != 0xD) { 
      if (log.isDebugEnabled()) { 
       log.debug("deleted character at: "+idx); 
      } 
      result.deleteCharAt(idx); 
     } 
    } 
    return result.toString(); 
} 

// Then 
String s = org.apache.commons.lang3.StringEscapeUtils.escapeXml(stripControlChars(s)); 

而且使用StringEscapeUtils.escapeXML下议院郎3版作为方法,其中逃逸更多的则需要对以前的版本中是很重要的。