Tại sao .length() của String không chính xác?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
342 lượt xem
Java master

Nó không chính xác vì nó sẽ chỉ tính đến số ký tự trong String. Nói cách khác, nó sẽ không tính đến các điểm mã (code points) bên ngoài cái được gọi là BMP (Basic Multilingual Plane - Mặt phẳng đa ngôn ngữ cơ bản), tức là các điểm mã có giá trị U + 10000 hoặc lớn hơn.

Lý do là lịch sử: khi Java lần đầu tiên được định nghĩa, một trong những mục tiêu của nó là coi tất cả văn bản là Unicode; nhưng tại thời điểm này, Unicode không xác định các điểm mã bên ngoài BMP. Vào thời điểm Unicode xác định các điểm mã như vậy, đã quá muộn để thay đổi ký tự.

Cách chính xác để đếm số ký tự thực trong một String, tức là số điểm mã, là:

someString.codePointCount(0, someString.length())
// or, with Java 8:
someString.codePoints().count()
{{login.error}}