Unicode NFC và NFD khác nhau thế nào?

Hiểu vì sao hai chữ tiếng Việt nhìn giống hệt nhau vẫn có thể chứa dãy mã khác nhau.

6 phút đọc•Cập nhật

Trả lời nhanh: NFC lưu một chữ có dấu bằng dạng dựng sẵn khi Unicode có ký tự tương ứng; NFD tách chữ cái gốc và các dấu kết hợp. Hai dạng thường hiển thị giống nhau nhưng có thể khác số code point, số byte và kết quả so sánh chuỗi.

Minh họa một ký tự Unicode ở dạng ghép và dạng tách dấu

Một chữ “ế”, hai cách lưu

Trong NFC, “ế” thường là một code point U+1EBF. Trong NFD, cùng hình thức có thể gồm “e” U+0065, dấu mũ U+0302 và dấu sắc U+0301. Trình duyệt ghép chúng khi hiển thị nên mắt thường khó thấy khác biệt.

Khác biệt này xuất hiện khi dữ liệu đi qua macOS, bộ gõ, cơ sở dữ liệu hoặc thư viện có quy tắc chuẩn hóa khác nhau. So sánh trực tiếp có thể trả về sai dù hai chuỗi trông giống nhau.

Cùng hiển thị, khác mã

Trước

NFC: ế → U+1EBF

Sau

NFD: e + ◌̂ + ◌́ → U+0065 U+0302 U+0301

Nên dùng NFC hay NFD?

NFC là lựa chọn thực tế cho nội dung web, tên người, tìm kiếm và lưu trữ văn bản thông thường vì thường gọn hơn và tương thích tốt. NFD hữu ích khi cần phân tích từng dấu hoặc làm việc với hệ thống chủ động lưu ký tự tách rời.

NFKC và NFKD còn thực hiện chuẩn hóa tương thích. Chúng có thể đổi ① thành 1 hoặc ² thành 2, vì vậy không nên dùng mù quáng cho nội dung cần giữ nguyên ý nghĩa trình bày.

Quy trình sửa lỗi an toàn

Giữ bản gốc, kiểm tra code point, chuẩn hóa một bản sao về NFC rồi so sánh lại. Nếu dữ liệu dùng làm khóa, email hoặc trường tìm kiếm, hãy chuẩn hóa nhất quán ở điểm nhập thay vì sửa rải rác sau này. Công cụ Chuẩn hóa Unicode trên trang này hiển thị cả code point trước và sau để bạn tự kiểm chứng.

Câu hỏi thường gặp

Chuẩn hóa Unicode có làm mất dấu tiếng Việt không?

NFC và NFD không bỏ dấu; chúng chỉ đổi cách mã hóa. NFKC/NFKD có thể thay đổi một số ký tự tương thích nên cần xem trước kết quả.

Vì sao độ dài chuỗi thay đổi?

Dạng NFD thường dùng nhiều code point và code unit hơn cho một ký tự hiển thị. Độ dài theo grapheme vẫn có thể là một.

Nguồn tham khảo