Language
String: length はUTF-16のコード単位を数える
絵文字のような補助文字はUTF-16で2単位になるため、lengthと文字数が一致しないことがあります。
SourceUnicodeLengths.java
Java 21
package examples.string;
public final class UnicodeLengths {
private UnicodeLengths() {}
public static int utf16Length(String value) {
return value.length();
}
public static int codePointLength(String value) {
return value.codePointCount(0, value.length());
}
}TestUnicodeLengthsTest.java
Java 21
package examples.string;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class UnicodeLengthsTest {
@Test
void 絵文字はUTF16のlengthでは2だがcodePointCountでは1になる() {
String rocket = "🚀";
assertEquals(2, UnicodeLengths.utf16Length(rocket));
assertEquals(1, UnicodeLengths.codePointLength(rocket));
}
}01Assertion
このテストで確認できること
- ロケット絵文字のlengthは2になる
- 同じ文字列のcodePointCountは1になる
UI上の文字数制限や切り詰めでは、UTF-16のコード単位ではなくコードポイントや書記素クラスターを意識します。
OBSERVED RESULT
expected: "🚀".length() → 2
actual: 2
expected: codePointCount → 1
actual: 1