Diacritical Mark
Ký hiệu phụ được thêm phía trên hoặc phía dưới ký tự. Chỉ thị sự khác biệt phát âm như dấu trọng âm và dấu umlaut.
Dấu phụ là ký hiệu phụ được thêm phía trên, phía dưới hoặc bên cạnh ký tự. Các ví dụ phổ biến bao gồm dấu trọng âm tiếng Pháp (é, è, ê), dấu umlaut tiếng Đức (ä, ö, ü), dấu ngã tiếng Tây Ban Nha (ñ) và dấu háček tiếng Séc (č, š, ž). Được sử dụng trong các ngôn ngữ trên toàn thế giới, đặc biệt là các ngôn ngữ dựa trên chữ Latin, các dấu này không chỉ là trang trí mà là yếu tố thiết yếu để phân biệt phát âm và ý nghĩa. Trong tiếng Pháp, ví dụ, ou (hoặc) và où (ở đâu) khác nhau về ý nghĩa chỉ bởi sự có mặt của dấu.
Unicode biểu diễn ký tự có dấu phụ theo hai cách. Một là "ký tự tổ hợp sẵn" (NFC: Normalization Form Composed), trong đó é được coi là một code point duy nhất U+00E9. Cách khác là "ký tự cơ sở + ký tự kết hợp" (NFD: Normalization Form Decomposed), kết hợp e (U+0065) với dấu sắc (U+0301). Biểu diễn kép này là tính năng thiết kế có chủ đích của Unicode, được giới thiệu để duy trì tương thích với các mã hóa ký tự hiện có trong khi biểu diễn linh hoạt ký tự từ bất kỳ ngôn ngữ nào. Sách công nghệ mã hóa ký tự bao gồm điều này chi tiết.
Trong thực tế, biểu diễn kép này gây ra các vấn đề nghiêm trọng với so sánh và sắp xếp chuỗi. Mặc dù hai phiên bản "é" trông giống nhau, chuỗi byte của chúng khác nhau giữa NFC và NFD, vì vậy so sánh byte đơn giản thất bại. Chuẩn hóa Unicode phải được áp dụng để thống nhất biểu diễn trong các tình huống yêu cầu kiểm tra đồng nhất chuỗi, như tìm kiếm cơ sở dữ liệu, khớp tên tệp và xác minh mật khẩu. Hệ thống tệp macOS (APFS) có xu hướng sử dụng NFD, trong khi Windows (NTFS) sử dụng NFC, khiến chuẩn hóa tên tệp đặc biệt quan trọng trong phát triển đa nền tảng.
Một hiểu lầm phổ biến là gọi tất cả dấu phụ đơn giản là "dấu trọng âm". Dấu trọng âm chỉ là một loại dấu phụ; danh mục rộng hơn còn bao gồm dấu cedilla (ç), dấu ogonek (ą), dấu macron (ā) và nhiều hơn nữa. Thú vị là, dakuten tiếng Nhật (゛) và handakuten (゜) cũng được coi là ký tự kết hợp trong Unicode, khiến chúng là họ hàng xa của dấu phụ theo nghĩa rộng.
Trong lập trình, chuẩn hóa được thực hiện bằng phương thức String.prototype.normalize() của JavaScript hoặc hàm unicodedata.normalize() của Python. Khi nhận đầu vào biểu mẫu trong ứng dụng web, áp dụng chuẩn hóa NFC phía máy chủ trước khi lưu dữ liệu vào cơ sở dữ liệu là thực hành tiêu chuẩn. Hướng dẫn lập trình đa ngôn ngữ cung cấp thêm ngữ cảnh.
Từ góc độ đếm ký tự, văn bản dạng NFD đếm ký tự cơ sở và ký tự kết hợp là code point riêng biệt, dẫn đến số đếm cao hơn ký tự hiển thị. Ví dụ, "café" là 4 ký tự trong NFC nhưng 5 ký tự trong NFD (c, a, f, e, ́). Để có "số ký tự hiển thị" chính xác, phải đếm theo đơn vị cụm grapheme, khiến việc xử lý dấu phụ là thách thức không thể tránh khỏi trong triển khai công cụ đếm ký tự.