BMP (Mặt phẳng đa ngôn ngữ cơ bản)
Vùng chứa 65.536 code point đầu tiên (U+0000 - U+FFFF) của Unicode. Hầu hết các ký tự sử dụng hàng ngày đều nằm trong vùng này, các ký tự ngoài BMP được biểu diễn bằng surrogate pair.
BMP (Basic Multilingual Plane - Mặt phẳng đa ngôn ngữ cơ bản) là mặt phẳng đầu tiên (Plane 0) trong tổng số 17 mặt phẳng của Unicode. Vùng này chứa 65.536 code point từ U+0000 đến U+FFFF, bao gồm ASCII, chữ cái Latin, chữ Hy Lạp, chữ Kirin, chữ Ả Rập, Hiragana, Katakana, bộ CJK cơ bản (khoảng 20.000 chữ Hán), và đặc biệt là toàn bộ bảng chữ cái tiếng Việt với các dấu thanh và dấu phụ.
Sự phân biệt giữa BMP và mặt phẳng bổ sung ảnh hưởng đến đếm ký tự trong môi trường sử dụng UTF-16. Trong UTF-16, ký tự BMP được biểu diễn bằng 2 byte (1 code unit), nhưng ký tự ngoài BMP cần 4 byte (2 code unit = surrogate pair). Thuộc tính String.length trong JavaScript trả về số code unit, nên chuỗi chứa emoji (ngoài BMP) sẽ cho giá trị lớn hơn số ký tự nhìn thấy.
Xem xét các ví dụ cụ thể: "A" (U+0041, BMP) có length bằng 1. Ký tự "𠮷" (U+20BB7, CJK mở rộng B) nằm ngoài BMP nên length bằng 2. Emoji "😀" (U+1F600) cũng ngoài BMP với length bằng 2. Emoji gia đình "👨👩👧👦" gồm 7 code point (4 trong số đó ngoài BMP) nên length lên tới 11.
Để đếm ký tự chính xác, cần phương pháp không phân biệt trong hay ngoài BMP. Trong JavaScript, Array.from(str).length hoặc [...str].length cho số ký tự theo đơn vị code point. Để chính xác hơn nữa, Intl.Segmenter đếm theo đơn vị grapheme cluster, xử lý đúng cả ký tự kết hợp và chuỗi emoji. Điều này đặc biệt quan trọng với tiếng Việt, vì một số ký tự có dấu có thể được biểu diễn dưới dạng ký tự kết hợp (ví dụ: "ắ" có thể là U+1EAF hoặc tổ hợp "a" + dấu breve + dấu sắc).
Bên trong BMP cũng có các vùng đặc biệt. U+D800 - U+DFFF được dành riêng cho surrogate và không biểu diễn ký tự hợp lệ khi đứng một mình. U+E000 - U+F8FF là vùng sử dụng riêng (Private Use Area) để các nhà sản xuất font hoặc doanh nghiệp gán ký tự tùy chỉnh. U+FDD0 - U+FDEF và 2 code point cuối mỗi mặt phẳng là "noncharacter" - vĩnh viễn không được gán cho ký tự nào.