FileDummy Logo
FileDummy
Cấu Trúc Tệp & Chuyên Sâu

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.

20 tháng 9, 20269 phút đọc1,420 lượt xem
encodingutf-8utf-16unicodetext-files

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óaByte mỗi ký tựTự đồng bộ?Mức độ sử dụng Web
UTF-81 đến 4 byte (Biến đổi)Có98,2% tổng số website
UTF-162 hoặc 4 byte (Biến đổi)Không (Cần BOM/Endianness)Windows nội bộ / JVM / JS engine
UTF-32Chính xác 4 byte (Cố định)CóHiếm (tốn nhiều bộ nhớ)
Thử Nghiệm Thực Tế.txt

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.
TypeScript
// 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.

NDL

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.

0/3000

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.

Bài Viết Liên Quan