From 53d1de098190a8276f1a67152d40bd18e9012921 Mon Sep 17 00:00:00 2001 From: cpovirk Date: Fri, 23 Jan 2026 20:04:05 -0800 Subject: [PATCH] Use `Character.charCount`. I don't see any discussion of why we didn't use this back in cl/8202370. It was added to Java [in Java 1.5](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Character.html#charCount(int)), just like [the `isSupplementaryCodePoint` method](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Character.html#isSupplementaryCodePoint(int)) that we've been using instead. Android has had it [since 1.0](https://developer.android.com/reference/java/lang/Character#charCount(int)) (though this code predates Android 1.0 by two weeks!), so there's no concern there. We didn't even expose the code to GWT at that point, either. RELNOTES=n/a PiperOrigin-RevId: 860359073 --- .../guava/src/com/google/common/escape/UnicodeEscaper.java | 5 +++-- guava/src/com/google/common/escape/UnicodeEscaper.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/android/guava/src/com/google/common/escape/UnicodeEscaper.java b/android/guava/src/com/google/common/escape/UnicodeEscaper.java index caad7da1fdc1..e84824791f93 100644 --- a/android/guava/src/com/google/common/escape/UnicodeEscaper.java +++ b/android/guava/src/com/google/common/escape/UnicodeEscaper.java @@ -15,6 +15,7 @@ package com.google.common.escape; import static com.google.common.base.Preconditions.checkNotNull; +import static java.lang.Character.charCount; import com.google.common.annotations.GwtCompatible; import org.jspecify.annotations.Nullable; @@ -134,7 +135,7 @@ protected int nextEscapeIndex(CharSequence csq, int start, int end) { if (cp < 0 || escape(cp) != null) { break; } - index += Character.isSupplementaryCodePoint(cp) ? 2 : 1; + index += charCount(cp); } return index; } @@ -171,7 +172,7 @@ protected final String escapeSlow(String s, int index) { // (for performance reasons) yield some false positives but it must never // give false negatives. char[] escaped = escape(cp); - int nextIndex = index + (Character.isSupplementaryCodePoint(cp) ? 2 : 1); + int nextIndex = index + charCount(cp); if (escaped != null) { int charsSkipped = index - unescapedChunkStart; diff --git a/guava/src/com/google/common/escape/UnicodeEscaper.java b/guava/src/com/google/common/escape/UnicodeEscaper.java index caad7da1fdc1..e84824791f93 100644 --- a/guava/src/com/google/common/escape/UnicodeEscaper.java +++ b/guava/src/com/google/common/escape/UnicodeEscaper.java @@ -15,6 +15,7 @@ package com.google.common.escape; import static com.google.common.base.Preconditions.checkNotNull; +import static java.lang.Character.charCount; import com.google.common.annotations.GwtCompatible; import org.jspecify.annotations.Nullable; @@ -134,7 +135,7 @@ protected int nextEscapeIndex(CharSequence csq, int start, int end) { if (cp < 0 || escape(cp) != null) { break; } - index += Character.isSupplementaryCodePoint(cp) ? 2 : 1; + index += charCount(cp); } return index; } @@ -171,7 +172,7 @@ protected final String escapeSlow(String s, int index) { // (for performance reasons) yield some false positives but it must never // give false negatives. char[] escaped = escape(cp); - int nextIndex = index + (Character.isSupplementaryCodePoint(cp) ? 2 : 1); + int nextIndex = index + charCount(cp); if (escaped != null) { int charsSkipped = index - unescapedChunkStart;