Tiếng Việt có thể xếp chồng tới hai dấu phụ trên một nguyên âm — ví dụ chữ "ế" vừa mang dấu mũ vừa mang dấu sắc — và điều này khiến một tên miền tiếng Việt thường tạo ra chuỗi Punycode dài hơn đáng kể so với một tên miền chỉ có một dấu phụ đơn giản như tiếng Tây Ban Nha hay tiếng Pháp.
Vì sao dấu tiếng Việt "nặng" hơn với Punycode
Thuật toán Punycode mã hóa vị trí và mã điểm của từng ký tự ngoài ASCII trong một nhãn tên miền. Một từ tiếng Việt có nhiều âm tiết mang dấu — như "việt-nam" — có thể có tới bốn, năm ký tự cần mã hóa riêng trong cùng một nhãn, khiến phần sau tiền tố xn-- dài hơn nhiều so với một domain chỉ có một chữ cái có dấu.
Unicode dựng sẵn và Unicode tổ hợp: một rắc rối riêng
Một chữ như "ế" có thể được biểu diễn bằng một mã điểm dựng sẵn (precomposed) duy nhất, hoặc bằng chữ "e" cộng với hai dấu tổ hợp (combining marks) riêng biệt. Về mặt thị giác hai cách biểu diễn này giống hệt nhau, nhưng vì là chuỗi byte khác nhau, chúng tạo ra hai chuỗi Punycode khác nhau cho cùng một tên miền — đây là lý do một số tên miền tiếng Việt cần được chuẩn hóa (NFC) trước khi mã hóa.
Các trường hợp sử dụng phổ biến
- Kiểm tra tên miền thực sự nào ẩn sau chuỗi
xn--...khó hiểu trong email hay liên kết. - Chuyển một tên miền có dấu tiếng Việt sang dạng Punycode trước khi cấu hình trong bảng điều khiển DNS chỉ chấp nhận ASCII.
- Chẩn đoán sự cố IDN trong địa chỉ email hoặc chứng chỉ.
Tấn công giả mạo bằng ký tự giống hệt nhau
Chữ "а" Kirin và chữ "a" Latinh trông giống hệt nhau trong hầu hết phông chữ, và kẻ tấn công lợi dụng điều này để đăng ký các tên miền như "аpple.com" — được Punycode mã hóa thành một chuỗi xn-- duy nhất nhưng trông như thương hiệu thật. Khi một nhãn trộn lẫn nhiều bảng chữ cái một cách đáng ngờ, trình duyệt hiện đại sẽ hiển thị thẳng dạng xn-- thô thay vì giải mã nó.