diff --git a/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java b/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java
index 243ffbed744f314a2ddc00292e245d7b2ee4c446..d9144d004fd02a1c2065d998248792a61583c05d 100644
--- a/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java
+++ b/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java
@@ -65,19 +65,25 @@ public class ServletUtil {
     /**
       * Truncate a String.
       * Same as s.substring(0, len) except that
-      * it won't split a surrogate pair.
+      * it won't split a surrogate pair or at a ZWJ.
       *
       * @param s non-null
+      * @param len greater than zero
       * @return s if shorter; s.substring(0, len) if
-      *           the char at len-1 is not a high surrogate;
-      *           s.substring(0, len+1) if it is
+      *           the char at len-1 is not a high surrogate
+      *           or the char at len-1 or len is not a zero-width joiner;
+      *           s.substring(0, len+1 or len+2) if it is
       * @since 0.9.33
       */
     public static String truncate(String s, int len) {
         if (s.length() <= len)
             return s;
-        if (Character.isHighSurrogate(s.charAt(len - 1)))
+        char c = s.charAt(len - 1);
+        // https://en.wikipedia.org/wiki/Zero-width_joiner
+        if (Character.isHighSurrogate(c) || c == 0x200D)
             return s.substring(0, len + 1);
+        if (s.charAt(len) == 0x200D)
+            return s.substring(0, len + 2);
         return s.substring(0, len);
     }
 }