From 41e20ae707a6b00fb4215bbdcfc1773fa541f7d9 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 25 Jul 2018 15:34:23 +0000 Subject: [PATCH] Utils: Don't truncate at a ZWJ --- .../java/src/net/i2p/servlet/util/ServletUtil.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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 243ffbed74..d9144d004f 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); } } -- GitLab