diff --git a/src/main/java/org/apache/commons/lang3/text/StrBuilder.java b/src/main/java/org/apache/commons/lang3/text/StrBuilder.java index d177ebed934..bbfc4074fb8 100644 --- a/src/main/java/org/apache/commons/lang3/text/StrBuilder.java +++ b/src/main/java/org/apache/commons/lang3/text/StrBuilder.java @@ -2756,7 +2756,6 @@ public StrBuilder reverse() { if (size == 0) { return this; } - final int half = size / 2; final char[] buf = buffer; boolean hasSurrogates = false; @@ -2768,20 +2767,23 @@ public StrBuilder reverse() { hasSurrogates |= Character.isSurrogate(left) || Character.isSurrogate(right); } if (hasSurrogates) { - // The plain swap leaves each surrogate pair in low-high order; restore the high-low order so a - // reversed supplementary code point stays a valid pair, matching StringBuilder#reverse(). - for (int i = 0; i < size - 1; i++) { - if (Character.isLowSurrogate(buf[i]) && Character.isHighSurrogate(buf[i + 1])) { - final char low = buf[i]; - buf[i] = buf[i + 1]; - buf[i + 1] = low; - i++; - } - } + restoreSurrogatePairs(buf, size); } return this; } + /** Restore high-low order of surrogate pairs that were inverted during reversal. */ + private void restoreSurrogatePairs(final char[] buf, final int size) { + for (int i = 0; i < size - 1; i++) { + if (Character.isLowSurrogate(buf[i]) && Character.isHighSurrogate(buf[i + 1])) { + final char low = buf[i]; + buf[i] = buf[i + 1]; + buf[i + 1] = low; + i++; + } + } + } + /** * Extracts the rightmost characters from the string builder without * throwing an exception.