Cập nhật lần cuối:
Một emoji được đếm là mấy ký tự? - Vì sao 1 emoji không phải lúc nào cũng là 1 ký tự
Một emoji mặt cười có phải là 1 ký tự không? Thế còn emoji gia đình? Thực ra thứ trông như 1 emoji trên màn hình có thể là cả một chuỗi nhiều ký tự ghép lại. Bạn đã bao giờ gặp cảnh "rõ ràng còn dư chỗ 1 ký tự mà gõ mãi không được" trên X (trước là Twitter) chưa?
Cách đếm ký tự của emoji
| Emoji | Nhìn thấy | Số ký tự Unicode | Độ dài UTF-16 | Số byte UTF-8 |
|---|---|---|---|---|
| Mặt cười | 1 hình | 1 ký tự | 2 | 4 byte |
| Ngón cái (like) | 1 hình | 1 ký tự | 2 | 4 byte |
| Ngón cái đổi màu da | 1 hình | 2 ký tự | 4 | 8 byte |
| Gia đình | 1 hình | 7 ký tự | 11 | 25 byte |
| Cờ cầu vồng | 1 hình | 4 ký tự | 6 | 14 byte |
| Cờ Nhật Bản | 1 hình | 2 ký tự | 4 | 8 byte |
Emoji gia đình nhìn thì chỉ là 1 hình, nhưng ruột bên trong là "người nam + ký tự nối + người nữ + ký tự nối + bé gái + ký tự nối + bé trai", tổng cộng 7 ký tự.
Vì sao số ký tự của emoji lại chẳng cái nào giống cái nào?
| Cơ chế | Giải thích | Ví dụ |
|---|---|---|
| Emoji cơ bản | 1 code point = 1 ký tự | Mặt cười (U+1F600) |
| Biến thể màu da | Emoji cơ bản + ký tự chỉ màu da = 2 ký tự | Ngón cái đổi màu da = ngón cái + màu da |
| Ghép bằng ZWJ | Nhiều emoji nối với nhau bằng ký tự vô hình | Gia đình = nam + ZWJ + nữ + ZWJ + bé gái + ZWJ + bé trai |
| Cờ quốc gia | Ghép 2 ký tự chỉ báo vùng (regional indicator) | Cờ Nhật = J + P |
ZWJ là viết tắt của "Zero Width Joiner" - ký tự nối có độ rộng bằng không. Nó không hiện ra trên màn hình nhưng vẫn được đếm là một ký tự.
Các mạng xã hội đếm emoji thế nào
| Dịch vụ | Mặt cười đếm là | Gia đình đếm là | Cách đếm |
|---|---|---|---|
| X (trước là Twitter) | 2 ký tự | 2 ký tự | Mọi emoji đều tính trọng số 2 cố định |
| 1 ký tự | 1 ký tự | Đếm theo hình nhìn thấy | |
| LINE | 1 ký tự | 1 ký tự | Đếm theo hình nhìn thấy |
| SMS | Thêm 1 emoji là cả tin chuyển sang giới hạn 70 ký tự | Tương tự | Đổi bảng mã (encoding) |
Trên X, mọi emoji đều được tính trọng số 2, bất kể cấu tạo đơn giản hay phức tạp - emoji gia đình gồm 7 ký tự Unicode cũng chỉ tính là 2. Dù vậy, dùng nhiều emoji vẫn ngốn bớt chỗ dành cho chữ trong giới hạn trọng số 280. Như đã nhắc trong bài lịch sử giới hạn ký tự của X, cách xử lý emoji chính là hình ảnh thu nhỏ cho độ rắc rối của việc đếm ký tự.
SMS và mối duyên nợ khó ngờ với emoji
Với SMS (tin nhắn ngắn), chỉ cần thêm đúng 1 emoji là giới hạn ký tự của cả tin nhắn thay đổi.
| Điều kiện | Số ký tự mỗi tin | Bảng mã |
|---|---|---|
| Chỉ có chữ cái Latin và số | 160 ký tự | GSM-7 (7 bit) |
| Chỉ có tiếng Nhật | 70 ký tự | UCS-2 (16 bit) |
| Có emoji | 70 ký tự | Chuyển sang UCS-2 |
SMS tiếng Anh cho phép 160 ký tự mỗi tin, nhưng chỉ cần chèn 1 emoji là toàn bộ tin nhắn bị chuyển sang bảng mã UCS-2 và giới hạn tụt xuống 70 ký tự. Mất đứt 90 ký tự chỉ vì đúng 1 emoji.
Số lượng emoji tăng không ngừng
| Năm | Phiên bản Unicode | Tổng số emoji | Emoji mới đáng chú ý |
|---|---|---|---|
| 2010 | 6.0 | Khoảng 720 | Mặt, động vật, đồ ăn cơ bản |
| 2015 | 8.0 | Khoảng 1.620 | Biến thể màu da |
| 2020 | 13.0 | Khoảng 3.300 | Ninja, trà sữa trân châu |
| 2024 | 16.0 | Khoảng 3.790 | Vân tay, đàn hạc, vết mực loang |
Emoji cứ tăng dần theo từng năm, đến 2024 đã có khoảng 3.790 loại. Bộ emoji điện thoại đầu tiên (NTT DoCoMo, 1999) chỉ có 176 hình. Sau 25 năm, con số đã nhân lên hơn 20 lần.
Lập trình và số ký tự của emoji
Đếm cho đúng số ký tự của emoji trong lập trình hóa ra là bài toán rất khó.
| Ngôn ngữ | Kết quả .length của emoji gia đình | Lý do |
|---|---|---|
| JavaScript | 11 | Đếm theo code unit UTF-16 |
| Python | 7 | Đếm theo code point Unicode |
| Swift | 1 | Đếm theo grapheme cluster (ký tự nhìn thấy) |
Cùng một emoji mà tùy ngôn ngữ lập trình, "độ dài" trả về khác hẳn nhau: khi thì 1, khi thì 7, khi thì 11. Đây là ví dụ ứng dụng hóc búa nhất của sự khác biệt giữa số ký tự và số byte.