NFC là viết tắt của Normalization Form C, dạng chuẩn hoá dựng sẵn trong Unicode Standard Annex #15: chữ nền và dấu được gom về một mã duy nhất khi Unicode có sẵn mã đó. Chữ “ệ” ở dạng NFC là một mã U+1EC7, còn ở dạng tổ hợp là chữ “e” cộng hai dấu rời.
Vì sao mọi công cụ chuẩn hoá NFC trước khi đếm
Cùng một câu gõ trên hai máy có thể được lưu bằng hai chuỗi mã khác nhau, dù màn hình hiển thị y hệt.
Không chuẩn hoá thì “ệ” lúc là 1 ký tự, lúc thành 3, và số ký tự của bài phụ thuộc bộ gõ chứ không phụ thuộc nội dung. Chuẩn TCVN 6909:2001 chọn dạng dựng sẵn cho tiếng Việt, nên site gọi normalize('NFC') ngay đầu mọi phép đếm, trước khi cắt grapheme. Việc này cũng làm số byte giảm: “ệ” dựng sẵn tốn 3 byte, kiểu tổ hợp tốn 5.
Dấu hiệu văn bản chưa ở dạng NFC
Mắt thường không thấy khác biệt, nên phải nhìn vào cách văn bản cư xử.
- Bấm xoá lùi một lần chỉ mất dấu, chữ nền còn lại.
- Tìm kiếm gõ “hệ thống” mà không ra kết quả dù chữ hiện trên màn hình.
- Số byte hoặc số code point cao hơn hẳn số ký tự nhìn thấy.
- Tệp xuất từ máy macOS, từ hệ thống cũ hoặc từ vài bộ gõ hay rơi vào dạng tổ hợp.
Tôi coi đây là lỗi đáng ngờ đầu tiên khi một người báo rằng số ký tự của site lệch với số của phần mềm họ dùng.
Công cụ liên quan tới NFC
Ba công cụ và một trang thuật ngữ sau đều bắt đầu bằng bước chuẩn hoá này.
- Đếm byte UTF-8 cho thấy chênh lệch giữa hai kiểu lưu cùng một chữ.
- Đếm ký tự online luôn trả cùng một số cho cùng một câu, bất kể bộ gõ.
- Tìm ký tự ẩn soi các mã lạ còn sót sau khi dán từ nơi khác.
- NFD là dạng ngược lại, tách chữ và dấu thành nhiều mã.