Đổi tên miền có dấu sang punycode xn-- và giải mã ngược lại
Punycode Converter chuyển tên miền tiếng Việt có dấu, hoặc tên miền viết bằng chữ Nga, chữ Hán, chữ Nhật, chữ Ả Rập..., sang dạng ASCII bắt đầu bằng xn-- mà hệ thống DNS dùng, và giải mã dạng xn-- trở lại chữ đọc được. Dán nhiều dòng cùng lúc, mỗi dòng có thể là tên miền, địa chỉ email hoặc URL đầy đủ; công cụ tự nhận chiều chuyển, báo lỗi theo chuẩn IDNA và ghi chú khi một nhãn có ký tự dễ nhầm với chữ Latin.
Tính năng nổi bật
- Tự nhận chiều chuyển cho từng dòng: có ký tự ngoài ASCII thì đổi sang punycode, có nhãn xn-- thì giải mã sang Unicode, dòng thuần ASCII được giữ nguyên
- Chiều sang punycode dùng bộ phân tích URL của chính trình duyệt (chuẩn WHATWG URL, IDNA theo UTS #46 không chuyển tiếp), nên kết quả trùng với cách trình duyệt mở tên miền
- Chiều giải mã tự viết theo thuật toán RFC 3492, đã kiểm thử với 19 vector mẫu ở mục 7.1 của RFC và đối chiếu thư viện punycode của Node
- Nhận tên miền, email (chỉ đổi phần sau @, cảnh báo khi phần trước @ có dấu vì cần SMTPUTF8) và URL đầy đủ (đổi tên miền, mã hóa phần đường dẫn bằng %, cột Unicode giải mã lại cho dễ đọc)
- Xử lý hàng loạt tới 2.000 dòng, bỏ dòng trống, đếm số dòng chuyển được, số dòng lỗi
- Báo rõ nhãn xn-- hỏng: không phải punycode hợp lệ, hoặc giải mã được nhưng ra ký tự IDNA cấm; ký tự vô hình hiện dưới dạng [U+XXXX]
- Cảnh báo chuẩn hóa (chữ toàn khổ, dấu chấm 。), nhãn dài quá 63 ký tự, tên miền quá 253 ký tự, nhãn bắt đầu hay kết thúc bằng gạch ngang, URL có phần tên người dùng trước @
- Ghi chú thông tin về ký tự dễ nhầm: nhãn trộn chữ Latin với Cyrillic, Hy Lạp, Armenia, hoặc nhãn viết toàn bằng chữ trông như Latin, kèm mã U+ của từng ký tự và chữ mà nhãn có thể bị đọc thành
- Sao chép riêng từng kết quả, sao chép cả cột punycode hoặc cả cột Unicode, tải CSV có BOM để mở bằng Excel
- Chạy hoàn toàn trên trình duyệt, không gửi danh sách tên miền đi đâu
Khi nào cần đổi tên miền sang punycode
Hệ thống DNS chỉ hiểu chữ cái Latin không dấu, chữ số và dấu gạch ngang. Một tên miền như tấnphát.vn phải được đổi thành xn--tnpht-0qa0544c.vn trước khi đưa vào bản ghi DNS, cấu hình máy chủ web (server_name của Nginx, ServerName của Apache), chứng chỉ SSL, danh sách cho phép của tường lửa hay cấu hình CDN. Trình duyệt tự làm việc này khi bạn gõ địa chỉ, nhưng phần lớn công cụ quản trị thì không: dán chữ có dấu vào ô cấu hình thường bị báo sai định dạng hoặc tệ hơn là lưu một giá trị không bao giờ khớp. Chiều ngược lại cũng hay cần: nhật ký truy cập, email bị trả về, bảng kê tên miền của nhà đăng ký đều ghi dạng xn--, và bạn cần đọc ra tên thật. Công cụ làm cả hai chiều cho cả một danh sách, đồng thời nhắc khi gặp ký tự có thể bị dùng để giả tên miền khác.
Lợi ích khi sử dụng
- Lấy đúng dạng xn-- để khai báo DNS, server_name, chứng chỉ SSL cho tên miền tiếng Việt mà không phải đoán
- Đọc nhanh các tên miền xn-- trong nhật ký, báo cáo, email bị trả về
- Kết quả trùng với trình duyệt đang dùng vì chiều mã hóa lấy từ chính bộ phân tích URL của trình duyệt
- Xử lý cả danh sách dài trong một lần, xuất CSV cho bảng tính
- Thấy ngay nhãn trộn chữ Latin với chữ Cyrillic hay Hy Lạp trước khi tin vào một tên miền lạ
- Không cần cài thư viện hay chạy lệnh, dùng được trên điện thoại
Cách chuyển tên miền sang punycode và ngược lại
- 1Dán vào ô Danh sách cần chuyển, mỗi dòng một tên miền, một địa chỉ email hoặc một URL; có thể trộn cả dạng có dấu lẫn dạng xn--. Bấm Nạp ví dụ để xem thử.
- 2Kết quả hiện ngay ở khối Kết quả: mỗi dòng ghi loại (Tên miền, Email, URL), chiều chuyển, Dạng ASCII và Dạng Unicode.
- 3Đọc các dòng chữ cam: cảnh báo chuẩn hóa, độ dài, và ô Thông tin về ký tự dễ nhầm nếu có. Dòng không chuyển được hiện lỗi màu đỏ kèm lý do.
- 4Bấm Chép cạnh từng kết quả để lấy riêng một giá trị.
- 5Bấm Sao chép cột punycode hoặc Sao chép cột Unicode để lấy cả danh sách theo đúng thứ tự dòng, hoặc bấm Tải CSV để lưu bảng đầy đủ.
Punycode, IDN và tiền tố xn--
IDN (Internationalized Domain Name) là tên miền chứa ký tự ngoài bảng chữ Latin cơ bản, như chữ tiếng Việt có dấu, chữ Nga, chữ Hán. Để không phải sửa toàn bộ hạ tầng DNS, chuẩn IDNA quy định mỗi nhãn (phần giữa hai dấu chấm) có ký tự quốc tế được đổi sang một chuỗi ASCII và gắn tiền tố xn--. Thuật toán đổi chuỗi đó là Punycode, mô tả trong RFC 3492. Punycode giữ lại các chữ ASCII của nhãn ở đầu, đặt một dấu gạch ngang, rồi mã hóa vị trí và mã của từng ký tự còn lại thành chữ cái và chữ số. Vì thế tấnphát thành xn--tnpht-0qa0544c: phần tnpht là các chữ không dấu giữ lại, phần sau dấu gạch ngang cho biết chèn ấ và á vào đâu. Nhãn chỉ toàn ký tự quốc tế như тест thì không có phần giữ lại, ra xn--e1aybc. Tên miền cấp cao cũng có thể là IDN, ví dụ .рф của Nga là xn--p1ai.
Chuẩn hóa trước khi mã hóa: vì sao kết quả đôi khi khác chữ bạn gõ
Trước khi chạy Punycode, chuẩn IDNA chuẩn hóa nhãn: đổi chữ hoa thành chữ thường, đưa ký tự về dạng chuẩn NFC (chữ ấ gõ bằng tổ hợp a cộng dấu mũ cộng dấu sắc được gộp thành một ký tự), đổi chữ và dấu chấm toàn khổ của bàn phím tiếng Nhật, tiếng Trung thành chữ thường, và từ chối ký tự bị cấm như khoảng trắng hay ký hiệu. Vì vậy ТЕСТ.рф và тест.рф cho cùng một kết quả, và công cụ ghi cảnh báo khi trình duyệt đã đổi tên miền của bạn thành dạng khác trước khi mã hóa. Một khác biệt lịch sử: theo IDNA2003, chữ ß của tiếng Đức bị đổi thành ss; theo IDNA2008 và chế độ không chuyển tiếp của UTS #46 mà trình duyệt hiện nay dùng, ß được giữ, nên faß.de thành xn--fa-hia.de. Trình duyệt hoặc thư viện cũ dùng chế độ chuyển tiếp có thể ra kết quả khác ở những ký tự này.
Tên miền tiếng Việt dùng ở đâu cần dạng xn--
Bất cứ chỗ nào không phải thanh địa chỉ trình duyệt. Trong bản ghi DNS, tên bản ghi và giá trị CNAME phải ở dạng xn--. Trong Nginx, server_name cần ghi dạng xn--, vì Nginx so sánh với tiêu đề Host mà trình duyệt gửi lên, và tiêu đề này luôn ở dạng ASCII. Apache cũng vậy với ServerName và ServerAlias. Khi xin chứng chỉ SSL, tên trong chứng chỉ ở dạng xn--; công cụ cấp chứng chỉ như Certbot cũng cần bạn truyền dạng này. Trong mã nguồn, khi so sánh tên miền lấy từ request, hãy so với dạng xn--. Ngược lại, trên tài liệu quảng cáo, danh thiếp hay nội dung trang web, bạn dùng dạng có dấu cho người đọc. Với email, chỉ phần tên miền sau @ được đổi sang punycode; phần trước @ có dấu cần máy chủ thư hỗ trợ SMTPUTF8 (RFC 6531), punycode không áp dụng cho phần đó.
Ký tự dễ nhầm và tấn công giả mạo tên miền
Nhiều bộ chữ có ký tự trông giống hệt chữ Latin: chữ а, е, о, р, с của tiếng Nga khác mã với a, e, o, p, c nhưng hiện ra gần như y hệt. Kẻ gian lợi dụng điều này để đăng ký tên miền nhìn giống thương hiệu thật, kiểu tấn công gọi là IDN homograph. Ví dụ được nêu nhiều là аррӏе.com viết toàn bằng chữ Cyrillic, có dạng ASCII là xn--80ak6aa92e.com, khác hẳn apple.com. Các trình duyệt lớn có quy tắc riêng để hiện dạng xn-- trên thanh địa chỉ khi tên miền trông đáng ngờ. Công cụ này đánh dấu hai trường hợp ở mức thông tin: nhãn trộn chữ Latin với chữ Cyrillic, Hy Lạp hoặc Armenia, và nhãn viết toàn bằng ký tự có hình giống chữ Latin; khi đó nó cho biết nhãn có thể bị đọc thành chữ gì. Danh sách ký tự dễ nhầm chỉ gồm những cặp phổ biến, không đầy đủ như bảng confusables của Unicode, nên không có ghi chú không có nghĩa là tên miền an toàn.
Giới hạn độ dài và những lỗi hay gặp
DNS giới hạn mỗi nhãn tối đa 63 ký tự và cả tên miền tối đa 253 ký tự, tính ở dạng ASCII. Vì punycode dài hơn chữ gốc, một nhãn tiếng Việt khoảng 40 chữ có dấu có thể vượt 63 ký tự sau khi mã hóa; công cụ cảnh báo trường hợp này vì trình duyệt không tự kiểm tra độ dài. Nhãn không được bắt đầu hay kết thúc bằng dấu gạch ngang, và hai dấu gạch ngang ở vị trí thứ ba, thứ tư được dành cho tiền tố như xn--. Lỗi hay gặp khi dán: có khoảng trắng trong tên miền (chép từ văn bản), có dấu gạch chéo hay dấu hỏi vì dán cả URL nhưng thiếu https:// (công cụ vẫn nhận ra và xử lý như URL), hoặc nhãn xn-- bị cắt cụt khi chép nên không giải mã được.
Công cụ được kiểm tra thế nào
Bộ giải mã và mã hóa Punycode được chạy với 19 vector mẫu (A đến S) trong mục 7.1 của RFC 3492, gồm tiếng Ả Rập, Trung, Séc, Do Thái, Hindi, Nhật, Hàn, Nga, Tây Ban Nha và câu tiếng Việt "Tại sao họ không thể chỉ nói tiếng Việt", đều giải mã đúng và mã hóa ngược ra đúng chuỗi. Ngoài ra 2.000 chuỗi ngẫu nhiên trộn chữ Latin, chữ có dấu, chữ Hán và biểu tượng được so với thư viện punycode có sẵn trong Node và cho kết quả trùng nhau. Chiều sang punycode không tự cài đặt mà dùng bộ phân tích URL của trình duyệt, nên đúng như trình duyệt bạn đang dùng xử lý; các ca như tấnphát.vn, ТЕСТ.рф, faß.de, chữ toàn khổ được đối chiếu với hàm domainToASCII của Node.
Câu hỏi thường gặp (FAQ)
Punycode là gì?
Punycode là cách mã hóa chuỗi Unicode thành chuỗi chỉ gồm chữ cái, chữ số và dấu gạch ngang, được định nghĩa trong RFC 3492. Nó dùng để đưa tên miền có dấu hoặc chữ không phải Latin vào hệ thống DNS. Nhãn đã mã hóa luôn bắt đầu bằng xn--.
Làm sao đổi tên miền tiếng Việt có dấu sang punycode?
Dán tên miền vào ô Danh sách cần chuyển, ví dụ tấnphát.vn, kết quả xn--tnpht-0qa0544c.vn hiện ngay ở cột Dạng ASCII. Bấm Chép để lấy giá trị. Dán nhiều dòng để đổi cả danh sách một lần.
Làm sao đọc một tên miền xn-- ra chữ có dấu?
Dán tên miền xn-- vào ô nhập, công cụ tự nhận đây là chiều giải mã và hiện chữ gốc ở cột Dạng Unicode. Nếu nhãn bị cắt cụt hoặc sai, công cụ báo lỗi kèm lý do. Ký tự vô hình trong kết quả được hiện dạng [U+XXXX] để bạn thấy.
Punycode decoder và punycode converter khác nhau gì?
Decoder chỉ giải mã xn-- ra chữ, converter làm cả hai chiều. Công cụ này là converter: mỗi dòng luôn có cả dạng ASCII và dạng Unicode, bạn lấy cột nào tùy nhu cầu.
Punycode converter này có dùng thay IDN converter của nhà đăng ký tên miền được không?
Được cho việc đổi qua lại giữa tên miền có dấu và dạng xn--: IDN converter của nhà đăng ký và trang này cùng dựa trên IDNA và RFC 3492, nên với tên miền tiếng Việt thông thường kết quả giống nhau. Khác biệt có thể xuất hiện với vài ký tự đặc biệt như ß hay ς, vì trang dùng quy tắc UTS #46 của trình duyệt (không chuyển tiếp) còn một số công cụ cũ dùng IDNA 2003. Khi khai báo DNS hay đăng ký, nên đối chiếu thêm với kết quả hiển thị ở trang quản lý tên miền của bạn.
Có đổi được cả địa chỉ email không?
Được, công cụ đổi phần tên miền sau dấu @ và giữ nguyên phần trước @. Nếu phần trước @ có dấu, công cụ cảnh báo vì punycode không áp dụng cho phần đó; hộp thư như vậy chỉ nhận được thư từ máy chủ hỗ trợ SMTPUTF8.
Dán cả URL có đường dẫn thì sao?
Công cụ nhận ra URL, đổi tên miền sang xn-- và mã hóa phần đường dẫn, truy vấn có dấu bằng %XX như trình duyệt gửi đi. Cột Dạng Unicode giải mã lại cả đường dẫn để dễ đọc. URL thiếu https:// nhưng có dấu / vẫn được nhận là URL.
Vì sao kết quả của tôi khác với công cụ khác?
Khác biệt thường nằm ở bước chuẩn hóa: công cụ dùng IDNA2003 hoặc chế độ chuyển tiếp sẽ đổi ß thành ss, công cụ dùng IDNA2008 thì không. Công cụ này dùng chính bộ phân tích URL của trình duyệt bạn đang mở. Với tên miền tiếng Việt thông thường, các cách đều cho cùng một kết quả.
Nhập tên miền có chữ hoa có sao không?
Không sao, tên miền không phân biệt hoa thường nên chữ hoa được đổi thành chữ thường trước khi mã hóa. ТЕСТ.рф và тест.рф cùng ra xn--e1aybc.xn--p1ai. Cột Dạng Unicode hiện dạng chữ thường đã chuẩn hóa.
Cấu hình Nginx cho tên miền tiếng Việt ghi thế nào?
Ghi dạng xn-- trong server_name, ví dụ server_name xn--tnpht-0qa0544c.vn;. Trình duyệt luôn gửi tiêu đề Host ở dạng ASCII nên Nginx so với dạng này. Tương tự với ServerName của Apache, bản ghi DNS và tên trong chứng chỉ SSL.
Ghi chú ký tự dễ nhầm có nghĩa là tên miền lừa đảo không?
Không nhất thiết. Ghi chú chỉ cho biết nhãn trộn nhiều bộ chữ hoặc toàn ký tự trông như chữ Latin, đặc điểm thường gặp ở tên miền giả mạo nhưng cũng có ở tên miền hợp lệ. Để đánh giá một đường link, hãy dùng thêm công cụ kiểm tra URL lừa đảo và xem tên miền gốc ở dạng xn--.
Không có ghi chú ký tự dễ nhầm thì tên miền có an toàn không?
Không thể kết luận như vậy. Danh sách ký tự dễ nhầm của công cụ chỉ gồm các cặp phổ biến giữa chữ Cyrillic, Hy Lạp, Armenia và chữ Latin. Tên miền giả mạo còn có thể dùng chữ Latin thường, như thay chữ m bằng rn, mà công cụ không kiểm tra.
Tên miền dài bao nhiêu thì vượt giới hạn?
Mỗi nhãn tối đa 63 ký tự và cả tên miền tối đa 253 ký tự, tính ở dạng xn--. Chữ có dấu làm dạng mã hóa dài hơn chữ gốc, nên công cụ đo độ dài trên dạng ASCII và cảnh báo khi vượt.
Có xử lý được nhiều tên miền cùng lúc không?
Được, mỗi dòng một mục, tối đa 2.000 dòng mỗi lần. Dòng trống được bỏ qua, mỗi dòng tự nhận chiều chuyển riêng. Bấm Tải CSV để lưu cả bảng gồm đầu vào, hai dạng kết quả, lỗi và ghi chú.
Vì sao có dòng báo lỗi trình duyệt từ chối tên miền?
Tên miền chứa ký tự IDNA không cho phép, như khoảng trắng, ký hiệu, biểu tượng cảm xúc, hoặc nhãn xn-- giải mã ra ký tự bị cấm. Hãy kiểm tra xem có chép thừa khoảng trắng hay ký tự lạ không. Nếu là nhãn xn--, công cụ cho biết nó giải mã ra gì để bạn biết chỗ sai.
Danh sách tên miền có bị gửi lên máy chủ không?
Không. Việc chuyển đổi chạy bằng JavaScript trên trình duyệt, kể cả phần dùng bộ phân tích URL. Trang không gửi hay lưu danh sách của bạn.
Dùng punycode trong code thế nào?
Trên trình duyệt và Node.js, new URL("http://tấnphát.vn").hostname trả về dạng xn--. Node có thêm url.domainToASCII và url.domainToUnicode. Python dùng "tấnphát.vn".encode("idna") theo IDNA2003, muốn theo IDNA2008 thì cài gói idna. PHP có idn_to_ascii trong extension intl.
Từ khóa liên quan
- punycode converter
- punycode
- punycode to unicode
- punycode decoder
- punycode generator
- punycode domain
- chuyển tên miền tiếng việt sang punycode
- tên miền tiếng việt có dấu
- idn converter
- idn to ascii
- xn-- decoder
- giải mã xn--
- punycode online
- unicode to punycode
- domain to ascii
- tên miền quốc tế idn
- punycode email
- chuyển đổi tên miền có dấu
- homograph attack
- kiểm tra ký tự giả mạo tên miền
- nginx server_name tên miền tiếng việt
- idna converter