Lần đầu tôi gặp lỗi kí tự hiển thị thành ô vuông □□□ là năm 2019, khi đang build Vkitext. Cùng một dòng text, copy từ trình duyệt sang database lại ra toàn dấu hỏi chấm. Sau khi mò mẫm, tôi mới biết: vấn đề không phải font chữ — mà là encoding. Và encoding đó có tên là Unicode.
Bài này tôi sẽ giải thích Unicode theo cách tôi ước mình được đọc hồi đó: không dùng thuật ngữ hàn lâm, có ví dụ thực tế, và quan trọng nhất — áp dụng được ngay cho kí tự đặc biệt, tên game, tên TikTok mà bạn đang dùng hàng ngày.
1. Unicode Là Gì — Giải Thích 1 Câu
Unicode là một bảng quy ước quốc tế, gán cho mỗi ký tự trên thế giới một con số duy nhất — gọi là code point — để máy tính có thể lưu trữ và hiển thị chúng nhất quán, dù là hệ điều hành nào, ngôn ngữ nào, hay thiết bị nào.
💡 Nói nôm na: Unicode là “danh bạ” của mọi ký tự tồn tại trên thế giới. Mỗi ký tự có một “số điện thoại” riêng không trùng với ai.

Trước khi có Unicode, mỗi quốc gia tự đặt ra bảng mã riêng. Việt Nam có TCVN, Nhật có Shift-JIS, phương Tây có Latin-1. Kết quả là một file text viết trên máy tính Nhật, mở trên máy tính Việt sẽ ra toàn ký tự vô nghĩa. Unicode ra đời để giải quyết đúng vấn đề này.
2. Code Point — “Số Điện Thoại” Của Mỗi Ký Tự
Mỗi ký tự trong Unicode có một code point, viết theo dạng U+XXXX (XXXX là số hex). Ví dụ:
| Ký tự | Code point | Tên Unicode | Ứng dụng |
|---|---|---|---|
| A | U+0041 | LATIN CAPITAL LETTER A | Bảng chữ cái cơ bản |
| ắ | U+1EAF | LATIN SMALL LETTER A WITH BREVE AND ACUTE | Tiếng Việt |
| ♥ | U+2665 | BLACK HEART SUIT | Kí tự trang trí |
| U+3000 | IDEOGRAPHIC SPACE | Khoảng trống đặc biệt | |
| ꜰ | U+A730 | LATIN LETTER SMALL CAPITAL F | Font chữ kiểu, tên game |
| 🔥 | U+1F525 | FIRE | Emoji, tên TikTok / FF |
Kí tự khoảng trống đặc biệt như U+3164 (ᅠ) hay U+2800 (⠀) — những thứ bạn dùng để tạo tên FF không hiển thị — đều là code point hợp lệ trong Unicode. Chúng không phải “lỗi” hay “hack”, chúng là ký tự được định nghĩa chính thức. Xem thêm: kí tự khoảng trống là gì.
3. Unicode Và UTF-8 Khác Nhau Gì?
Đây là điểm nhiều người — kể cả developer — hay nhầm:
Unicode = bảng quy ước (định nghĩa code point cho mỗi ký tự).
UTF-8 = cách mã hóa (cách lưu code point đó thành bytes trên ổ cứng hoặc truyền qua mạng).
UTF-8 là một trong nhiều cách encode Unicode. Ngoài ra còn có UTF-16, UTF-32. Nhưng UTF-8 đang chiếm hơn 98% website trên thế giới vì tương thích ngược với ASCII, tiết kiệm dung lượng, và linh hoạt: ký tự đơn giản dùng 1 byte, ký tự phức tạp dùng tới 4 byte.
Cùng ký tự, UTF-8 lưu bao nhiêu byte?
| Ký tự | Code point | Bytes UTF-8 | Số byte |
|---|---|---|---|
| A | U+0041 | 0x41 | 1 byte |
| é | U+00E9 | 0xC3 0xA9 | 2 byte |
| ắ | U+1EAF | 0xE1 0xBA 0xAF | 3 byte |
| 🔥 | U+1F525 | 0xF0 0x9F 0x94 0xA5 | 4 byte |
💡 Emoji 🔥 chiếm 4 byte trong UTF-8 — đó là lý do một số form giới hạn 255 ký tự nhưng bị “tràn” khi bạn nhập nhiều emoji.
4. So Sánh Các Bảng Mã: Tại Sao Unicode Thắng?
| Encoding | Số ký tự | Hỗ trợ tiếng Việt? | Hiện tại dùng? |
|---|---|---|---|
| ASCII | 128 | ❌ Không | Một phần |
| Latin-1 | 256 | ❌ Không | Giảm dần |
| UTF-8 (Unicode) | 1,1 triệu+ | ✅ Có | ✅ Chuẩn hiện nay |
| UTF-16 | 1,1 triệu+ | ✅ Có | Nội bộ hệ thống |
Trước 2000, Việt Nam dùng TCVN3 (còn gọi là ABC) và VNI. Bạn nào còn nhớ cảnh copy bài từ internet về Word bị lỗi font chữ — đó chính là xung đột giữa các bảng mã. Unicode (UTF-8) chấm dứt hoàn toàn vấn đề đó.
5. Unicode Ứng Dụng Thực Tế Như Thế Nào?
5.1 Kí tự đặc biệt trong tên game
Khi bạn đặt tên FF kiểu ꜰʟᴏᴡᴇʀ hay dùng kí tự tàng hình, thực ra bạn đang dùng các code point Unicode ngoài bảng Latin thông thường:
- ꜰ = U+A730 (Latin Letter Small Capital F)
- ʟ = U+029C (Latin Letter Small Capital L)
- ᴏ = U+1D0F (Latin Letter Small Capital O)
💡 Garena không chặn những code point này vì chúng hoàn toàn hợp lệ trong Unicode — đó là lý do chúng “qua” được bộ lọc tên. Xem bộ sưu tập đầy đủ tại: kí tự FF.
5.2 Khoảng trống đặc biệt
Kí tự khoảng trống bình thường (Space bar) là U+0020. Nhưng trong game, U+0020 thường bị chặn trong tên nhân vật. Đó là lý do chúng ta dùng:
- U+3164 — Hangul Filler: khoảng trống rộng, phổ biến nhất trong FF
- U+2800 — Braille Pattern Blank: trông như khoảng trống nhưng không phải space
- U+200B — Zero Width Space: vô hình hoàn toàn, không chiếm không gian
5.3 Font chữ kiểu (Fancy Text)
Các font chữ kiểu như 𝔽𝕒𝕟𝕔𝕪, 𝓒𝓾𝓻𝓼𝓲𝓿𝓮, hay ꜱᴍᴀʟʟ ᴄᴀᴘꜱ thực ra không phải font — đó là các ký tự Unicode khác nhau trông giống chữ Latin. Chính vì vậy chúng hoạt động trên mọi nơi, không cần cài font. Thử ngay tại: chữ kiểu đẹp.
6. Hai Lỗi Unicode Phổ Biến Nhất
Lỗi 1: Ô vuông □ hoặc dấu hỏi chấm khi hiển thị
Nguyên nhân: Font đang dùng không có glyph cho code point đó. Ví dụ font Times New Roman không có ký tự Hangul, nên U+3164 hiện thành □.
Cách xử lý: Dùng font đa ngữ như Noto Sans, hoặc dựa vào fallback font của trình duyệt — Chrome và Android tự làm điều này tốt hơn iOS.
Lỗi 2: Text bị loạn khi lưu vào database
Nguyên nhân: Database đang dùng charset latin1 hoặc utf8 cũ của MySQL — loại này chỉ hỗ trợ 3 byte, không encode được emoji 4 byte.
Cách xử lý: Chuyển database sang utf8mb4 — đây là UTF-8 thực sự, hỗ trợ toàn bộ Unicode kể cả emoji:
ALTER TABLE ten_bang CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
7. Câu Hỏi Thường Gặp
Unicode có bao nhiêu ký tự?
Phiên bản Unicode 15.1 (2023) định nghĩa 149.813 ký tự, trong tổng dung lượng có thể chứa hơn 1,1 triệu code point. Con số này tiếp tục tăng mỗi năm khi thêm emoji mới, chữ viết cổ, và ký hiệu khoa học.
Unicode và ASCII khác nhau thế nào?
ASCII chỉ có 128 ký tự (0–127), toàn chữ Latin và ký hiệu cơ bản. Unicode bao gồm toàn bộ ASCII (code point 0–127 giống hệt nhau) và mở rộng thêm hơn 1 triệu ký tự từ mọi ngôn ngữ trên thế giới.
Sao kí tự đặc biệt không hiện trên điện thoại bạn bè?
Vì điện thoại đó thiếu font hỗ trợ code point đó, hoặc hệ điều hành cũ chưa cập nhật bảng Unicode mới nhất. iOS và Android đều cập nhật bộ font theo từng phiên bản OS.
U+3164 và U+2800 cái nào tốt hơn cho tên FF?
U+3164 (Hangul Filler) phổ biến hơn và ổn định hơn trên Free Fire, đặc biệt từ OB26 trở đi. U+2800 (Braille Blank) vẫn hoạt động nhưng đôi khi bị filter ở một số server region. Khuyên dùng U+3164 làm mặc định.
Làm sao biết một ký tự có code point là gì?
Cách nhanh nhất: dùng công cụ tra cứu trực tiếp trên Vkitext. Hoặc nếu bạn dùng Python:
>>> hex(ord("ắ"))
'0x1eaf' # → U+1EAF
Tóm Lại
Unicode là nền tảng của mọi thứ liên quan đến text trong thời đại số — từ tên game, bio TikTok, kí tự đặc biệt, cho đến emoji và font chữ kiểu. Hiểu Unicode giúp bạn dùng kí tự đúng cách, biết tại sao lỗi xảy ra, và tận dụng được kho ký tự khổng lồ mà ít người khai thác.
Nếu bạn đang tìm kí tự đặc biệt để dùng ngay, ghé các công cụ trên Vkitext — mọi ký tự đều có code point kèm theo để bạn hiểu mình đang dùng gì.