diff --git a/src/helma/util/HtmlEncoder.java b/src/helma/util/HtmlEncoder.java
index da45009e..9c769e4b 100644
--- a/src/helma/util/HtmlEncoder.java
+++ b/src/helma/util/HtmlEncoder.java
@@ -282,8 +282,13 @@ public final class HtmlEncoder {
      *
      */
     public final static String encode (String str) {
+	if  (str == null)
+	    return null;
+	int l = str.length();
+	if (l == 0)
+	    return "";
 	// try to make stringbuffer large enough from the start
-	StringBuffer ret = new StringBuffer (Math.round (str.length()*1.4f));
+	StringBuffer ret = new StringBuffer (Math.round (l*1.4f));
 	encode (str, ret);
 	return ret.toString();
     }
@@ -300,7 +305,7 @@ public final class HtmlEncoder {
 
 	// are we currently within a < and a >?
 	boolean insideTag=false;
-	// if we are inside a  tag, we encode everything to make 
+	// if we are inside a  tag, we encode everything to make
 	// documentation work easier
 	boolean insideCodeTag = false;
 	// are we within a macro tag?
@@ -351,9 +356,9 @@ public final class HtmlEncoder {
 	                int j = tagStart;
 	                while (j':
 	            if (insideTag) {
 	                ret.append ('>');
-	                if (insideMacroTag) 
+	                if (insideMacroTag)
 	                    insideMacroTag = insideTag = !(chars[i-1] == '%');
 	                else if (insideComment)
 	                    insideComment = insideTag = !(chars[i-2] == '-' && chars[i-1] == '-');
@@ -433,23 +438,33 @@ public final class HtmlEncoder {
      *
      */
     public final static String encodeFormValue (String str) {
-	StringBuffer ret = new StringBuffer (Math.round (str.length()*1.2f));
+	if  (str == null)
+	    return null;
+	int l = str.length();
+	if (l == 0)
+	    return "";
+	StringBuffer ret = new StringBuffer (Math.round (l*1.2f));
 	encodeAll (str, ret, false);
 	return ret.toString();
     }
 
 
     /**
-     *  
-     */ 
+     *
+     */
     public final static String encodeAll (String str) {
-	StringBuffer ret = new StringBuffer (Math.round (str.length()*1.2f));
+	if  (str == null)
+	    return null;
+	int l = str.length();
+	if (l == 0)
+	    return "";
+	StringBuffer ret = new StringBuffer (Math.round (l*1.2f));
 	encodeAll (str, ret, true);
-	return ret.toString(); 
+	return ret.toString();
     }
 
     /**
-     *  
+     *
      */
     public final static String encodeAll (String str, StringBuffer ret) {
 	encodeAll (str, ret, true);
@@ -458,8 +473,8 @@ public final class HtmlEncoder {
 
 
     /**
-     *  
-     */ 
+     *
+     */
     public final static void encodeAll (String str, StringBuffer ret, boolean encodeNewline) {
 	if  (str == null)
 	    return;
@@ -503,7 +518,12 @@ public final class HtmlEncoder {
 
 
     public final static String encodeXml (String str) {
-	StringBuffer ret = new StringBuffer (Math.round (str.length()*1.2f));
+	if  (str == null)
+	    return null;
+	int l = str.length();
+	if (l == 0)
+	    return "";
+	StringBuffer ret = new StringBuffer (Math.round (l*1.2f));
 	encodeXml (str, ret);
 	return ret.toString();
     }
@@ -539,25 +559,31 @@ public final class HtmlEncoder {
      }
 
     // test method
-	public static String printCharRange (int from, int to) {
-	    StringBuffer response = new StringBuffer();
-		for (int i=from;i= 128 && i < 256)
-	            response.append (transform[i-128]);
-	        else {
-	            response.append ("");
-	            response.append (i);
-	            response.append (";");
-	        }
-			response.append ("\r\n");
-		}
-		return response.toString();
+    public static String printCharRange (int from, int to) {
+	StringBuffer response = new StringBuffer();
+	for (int i=from;i= 128 && i < 256)
+	        response.append (transform[i-128]);
+	    else {
+	        response.append ("");
+	        response.append (i);
+	        response.append (";");
+	    }
+	    response.append ("\r\n");
 	}
+	return response.toString();
+    }
+
+    // for testing...
+    public static void main (String[] args) {
+	for (int i=0; i