diff --git a/util/src/main/java/org/jf/util/ClassFileNameHandler.java b/util/src/main/java/org/jf/util/ClassFileNameHandler.java index aede10e8..7ac77352 100644 --- a/util/src/main/java/org/jf/util/ClassFileNameHandler.java +++ b/util/src/main/java/org/jf/util/ClassFileNameHandler.java @@ -33,7 +33,9 @@ import ds.tree.RadixTreeImpl; import javax.annotation.Nonnull; import java.io.*; +import java.nio.ByteBuffer; import java.nio.CharBuffer; +import java.nio.IntBuffer; import java.util.regex.Pattern; /** @@ -87,8 +89,9 @@ public class ClassFileNameHandler { packageElement += "#"; } - if (packageElement.length() > MAX_FILENAME_LENGTH) { - packageElement = shortenPathComponent(packageElement, MAX_FILENAME_LENGTH); + int utf8Length = utf8Length(packageElement); + if (utf8Length > MAX_FILENAME_LENGTH) { + packageElement = shortenPathComponent(packageElement, utf8Length - MAX_FILENAME_LENGTH); } packageElements[elementIndex++] = packageElement; @@ -109,8 +112,9 @@ public class ClassFileNameHandler { packageElement += "#"; } - if ((packageElement.length() + fileExtension.length()) > MAX_FILENAME_LENGTH) { - packageElement = shortenPathComponent(packageElement, MAX_FILENAME_LENGTH - fileExtension.length()); + int utf8Length = utf8Length(packageElement) + utf8Length(fileExtension); + if (utf8Length > MAX_FILENAME_LENGTH) { + packageElement = shortenPathComponent(packageElement, utf8Length - MAX_FILENAME_LENGTH); } packageElements[elementIndex] = packageElement; @@ -118,12 +122,87 @@ public class ClassFileNameHandler { return top.addUniqueChild(packageElements, 0); } - @Nonnull - static String shortenPathComponent(@Nonnull String pathComponent, int maxLength) { - int toRemove = pathComponent.length() - maxLength + 1; + private static int utf8Length(String str) { + int utf8Length = 0; + int i=0; + while (i 0 || secondStart < codePoints.length)) { + if (firstEnd > 0) { + firstEnd--; + bytesRemoved += utf8Length(codePoints[firstEnd]); + } + + if (bytesRemoved < bytesToRemove && secondStart < codePoints.length) { + bytesRemoved += utf8Length(codePoints[secondStart]); + secondStart++; + } + } + + StringBuilder sb = new StringBuilder(); + for (int i=0; i