Mã Hóa Ký Tự UTF-8, UTF-16 Và UTF-32: Bản Chất Byte & Tránh Lỗi Font
Hiểu rõ cơ chế biến đổi code point Unicode thành byte trong UTF-8, xử lý Byte Order Mark (BOM) và khắc phục triệt để lỗi hiển thị font.
Lỗi mã hóa văn bản — các ký tự mojibake như é thay vì é — xảy ra khi phần mềm hiểu sai các chuỗi byte đại diện cho các code point Unicode. Hiểu cách UTF-8, UTF-16 và UTF-32 mã hóa ký tự là điều thiết yếu để xây dựng pipeline xử lý tệp có khả năng chịu lỗi tốt.
Mô Hình Unicode: Code Point vs Byte
Unicode ánh xạ các ký tự trừu tượng thành code point số (ví dụ: U+0041 cho 'A', U+1F600 cho '😀'). Định dạng chuyển đổi (UTF) quy định cách các số đó được tuần tự hóa thành byte nhị phân.
| Mã hóa | Byte mỗi ký tự | Tự đồng bộ? | Mức độ sử dụng Web |
|---|---|---|---|
| UTF-8 | 1 đến 4 byte (Biến đổi) | Có | 98,2% tổng số website |
| UTF-16 | 2 hoặc 4 byte (Biến đổi) | Không (Cần BOM/Endianness) | Windows nội bộ / JVM / JS engine |
| UTF-32 | Chính xác 4 byte (Cố định) | Có | Hiếm (tốn nhiều bộ nhớ) |
Tải file văn bản UTF-8 mẫu 1MB để kiểm thử giải mã ký tự và phân tích multibyte.
Tải File Mẫu 1MB TXT →Cách Hoạt Động Của UTF-8 Với Độ Dài Biến Đổi
- Ký tự ASCII (0-127): Mã hóa trong 1 byte (
0xxxxxxx), duy trì 100% khả năng tương thích ngược với ASCII cũ. - Latin, Hy Lạp, Cyrillic (128-2047): Mã hóa trong 2 byte.
- Chữ Á Đông, CJK (2048-65535): Mã hóa trong 3 byte.
- Emoji & ký hiệu hiếm (65536+): Mã hóa trong 4 byte.
// Giải mã byte an toàn trong Node.js
import { TextDecoder } from 'util';
export function decodeTextSafely(buffer: Buffer): string {
// fatal: true ném ngoại lệ thay vì chèn ký tự thay thế
const decoder = new TextDecoder('utf-8', { fatal: true });
return decoder.decode(buffer);
}
Byte Order Mark (BOM)
UTF-8 không yêu cầu Byte Order Mark vì các byte được sắp xếp giống nhau trên máy big-endian và little-endian. Tuy nhiên, một số phần mềm Windows (Notepad, Excel) thêm 0xEF 0xBB 0xBF ở đầu. Luôn loại bỏ các byte BOM đầu khi phân tích tệp văn bản trong Node.js.
Nguyễn Đại Long
Tác GiảBackend Lead • Chuyên gia Kiến trúc Hệ thống Phân tán & Lưu trữ Đám mây
Hơn 4 năm kinh nghiệm thiết kế các hệ thống xử lý tệp tải lên thông lượng lớn, tối ưu hóa cơ sở dữ liệu và hạ tầng phân tán Cloudflare R2 / AWS S3. Người sáng lập FileDummy và Mạng lưới Hệ sinh thái NDL.
Bài viết này có hữu ích không?
Bấm Thích để ủng hộ tác giả và giúp bài viết lan tỏa tới cộng đồng lập trình viên.
Thảo Luận Kỹ Thuật & Đóng Góp Ý Kiến (0)
Chia sẻ kết quả benchmark, phản hồi các trường hợp biên hoặc đặt câu hỏi chuyên môn.
Chưa có bình luận nào. Hãy là lập trình viên đầu tiên bắt đầu cuộc thảo luận!
Câu Hỏi Thường Gặp (FAQ)
Why is UTF-8 dominant on the web?▾
UTF-8 is backward-compatible with ASCII, self-synchronizing (character boundaries are detectable without reading from the start), has no byte order ambiguity, and is space-efficient for ASCII-heavy text. HTTP, HTML5, JSON, and XML all default to UTF-8.
What is a BOM (Byte Order Mark) and do I need it?▾
A BOM is a special Unicode character (U+FEFF) that indicates byte order for UTF-16/UTF-32, or identifies UTF-8. UTF-8 BOM (EF BB BF) is optional and often causes problems with parsers. Modern tooling recommends UTF-8 without BOM.
When should I use UTF-16 instead of UTF-8?▾
UTF-16 is used internally by Windows APIs, Java, JavaScript engines, and .NET — they store strings as UTF-16 in memory. For file storage and network transmission, prefer UTF-8. Use UTF-16 only when required by specific APIs.