diff --git a/src/main/org/apache/tools/ant/util/DOMElementWriter.java b/src/main/org/apache/tools/ant/util/DOMElementWriter.java index 107348a75..67b02b345 100644 --- a/src/main/org/apache/tools/ant/util/DOMElementWriter.java +++ b/src/main/org/apache/tools/ant/util/DOMElementWriter.java @@ -142,7 +142,7 @@ public class DOMElementWriter { case Node.CDATA_SECTION_NODE: out.write(""); break; @@ -183,7 +183,8 @@ public class DOMElementWriter { } /** - * Escape <, > & ' and " as their entities. + * Escape <, > & ', " and control characters + * < 0x20 as their entities. */ public String encode(String value) { sb.setLength(0); @@ -211,9 +212,51 @@ public class DOMElementWriter { sb.append('&'); } break; + case '\t': + case '\n': + case '\r': + sb.append(c); + break; default: + if (c < 0x20) { + sb.append("&#x"); + sb.append(Integer.toHexString(c)); + sb.append(';'); + } else { + sb.append(c); + } + break; + } + } + return sb.toString(); + } + + /** + * Escape control characters < x20 as their entities. + * + *

See XML 1.0 2.2 http://www.w3.org/TR/1998/REC-xml-19980210#charsets.

+ */ + public String encodedata(final String value) { + sb.setLength(0); + for (int i = 0; i < value.length(); ++i) { + char c = value.charAt(i); + switch (c) { + case '\t': + case '\n': + case '\r': sb.append(c); break; + + default: + if (c < 0x20) { + sb.append("&#x"); + sb.append(Integer.toHexString(c)); + sb.append(';'); + } else { + sb.append(c); + } + break; } } return sb.toString(); diff --git a/src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java b/src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java index f7afe8cdd..d7c4d08d2 100644 --- a/src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java +++ b/src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java @@ -100,5 +100,8 @@ public class DOMElementWriterTest extends TestCase { assertEquals(""", w.encode("\"")); assertEquals("<", w.encode("<")); assertEquals("&", w.encode("&")); + assertEquals("", w.encode("\u0017")); + assertEquals("\"20;&", w.encodedata("\"20;&")); + assertEquals("", w.encodedata("\u0017")); } }