Punycode là một cú pháp mã hóa được sử dụng để chuyển đổi chuỗi ký tự Unicode (UTF-8) thành chuỗi ký tự ASCII cơ bản. Vì tên máy chủ chỉ hiểu các ký tự ASCII nên Punycode được sử dụng. Nó được sử dụng như một tên miền quốc tế hóa (IDN hoặc IDNA). Hãy hiểu nó bằng một ví dụ:
Giả sử nếu bạn tìm kiếm mañana.com trong trình duyệt của mình thì trình duyệt của bạn (được bật IDNA) trước tiên hãy chuyển đổi mã này thành punycode xn--maana-pta.com vì ký tự ñ không được phép trong tên miền thông thường. Nó không được hỗ trợ trong các phiên bản cũ hơn.
Giới thiệu về Punycode
Punycode là một phương pháp mã hóa ký tự Unicode để chúng có thể được sử dụng trong hệ thống DNS (Domain Name System) và các thành phần internet khác mà chỉ hỗ trợ ASCII. Punycode cho phép biểu diễn các ký tự không ASCII, như các ký tự đặc biệt, ký tự không thuộc bảng chữ cái tiếng Anh, hoặc các ký tự thuộc các bộ ký tự như tiếng Trung, tiếng Nhật, tiếng Hàn, và nhiều hơn nữa.
Trong Punycode, các ký tự Unicode được chuyển đổi thành một chuỗi ký tự ASCII dựa trên thuật toán quy định. Kết quả là một chuỗi ASCII mà hầu hết các thành phần internet có thể hiểu và xử lý. Khi cần sử dụng các ký tự không ASCII trong tên miền hoặc các phần khác của URL, Punycode được sử dụng để mã hóa và giải mã các ký tự này.
Ví dụ, tên miền “bánhcuốn.com” sẽ được mã hóa bằng Punycode thành “xn--bnhcon-eba3975a”. Khi gửi thông tin qua mạng hoặc lưu trữ vào cơ sở dữ liệu, phiên bản Punycode sẽ được sử dụng. Khi hiển thị cho người dùng cuối, Punycode sẽ được giải mã và hiển thị dưới dạng tên miền gốc “bánhcuốn.com”.
Punycode đóng vai trò quan trọng trong việc hỗ trợ đa ngôn ngữ và kết nối toàn cầu trên internet. Nó cho phép người dùng sử dụng các ký tự đặc biệt và ngôn ngữ của họ trong tên miền và các phần khác của URL mà không gặp vấn đề về tương thích hoặc hỗ trợ.
Cách sử dụng Punycode trong Node.js
Trong Node.js, bạn có thể sử dụng module punycode
để mã hóa và giải mã Punycode. Dưới đây là các bước để sử dụng Punycode trong Node.js:
- Cài đặt module Punycode: Mở terminal và chạy lệnh sau để cài đặt module Punycode từ npm (Node Package Manager):
npm install punycode
- Import module Punycode: Trong mã nguồn Node.js của bạn, hãy import module Punycode bằng cách thêm dòng sau vào đầu file:
const punycode = require('punycode');
- Mã hóa tên miền thành Punycode: Để mã hóa một tên miền từ Unicode sang Punycode, bạn có thể sử dụng phương thức
punycode.toASCII()
như sau:
const domain = 'bánhcuốn.com'; const punycodeDomain = punycode.toASCII(domain); console.log(punycodeDomain); // Kết quả: xn--bnhcon-eba3975a
- Giải mã Punycode thành tên miền: Để giải mã một chuỗi Punycode thành tên miền Unicode, bạn có thể sử dụng phương thức
punycode.toUnicode()
như sau:
const punycodeDomain = 'xn--bnhcon-eba3975a'; const domain = punycode.toUnicode(punycodeDomain); console.log(domain); // Kết quả: bánhcuốn.com
Bằng cách sử dụng module Punycode trong Node.js, bạn có thể mã hóa các ký tự không ASCII sang Punycode và giải mã Punycode trở lại thành các ký tự Unicode, giúp bạn làm việc với tên miền và URL đa ngôn ngữ một cách dễ dàng và hiệu quả.
Punycode trong Node.js
Punycode.js được đóng gói với Node.js v0.6.2 và các phiên bản mới hơn. Nếu bạn muốn sử dụng nó với các phiên bản Node.js khác thì trước tiên hãy sử dụng npm để cài đặt mô-đun punycode. Bạn phải sử dụng request (‘punycode’) để truy cập nó.
Cú pháp:
punycode = require('punycode');
Xem thêm ASCII là gì ? Cách chuyển đổi ASCII
punycode.decode (string)
Nó được sử dụng để chuyển đổi chuỗi ký hiệu ASCII Punycode thành chuỗi ký hiệu Unicode.
File: punycode_example1.js
punycode = require('punycode'); console.log(punycode.decode('maana-pta'));
punycode.encode (string)
Nó được sử dụng để chuyển đổi một chuỗi ký hiệu Unicode thành chuỗi Punycode ký hiệu ASCII.
File: punycode_example2.js
punycode = require('punycode'); console.log(punycode.encode('☃-⌘'));
Xem thêm Tấn công Unicode Encoding là gì?
punycode.toASCII (domain)
Nó được sử dụng để chuyển đổi một chuỗi Unicode đại diện cho một tên miền sang Punycode. Chỉ phần không phải ASCII của tên miền được chuyển đổi.
File: punycode_example3.js
punycode = require('punycode'); console.log(punycode.toASCII('mañana.com'));
Xem thêm Unicode – hàm ord() trong python
punycode.toUnicode (domain)
Nó được sử dụng để chuyển đổi một chuỗi Punycode đại diện cho một tên miền sang Unicode. Chỉ phần Punycoded của tên miền được chuyển đổi.
File: punycode_example4.js
punycode = require('punycode'); console.log(punycode.toUnicode('xn--maana-pta.com'));
Xem thêm Kiểu rune trong Golang
Ví dụ sử dụng Punycode trong Node.js
Dưới đây là một ví dụ sử dụng Punycode trong Node.js để mã hóa và giải mã tên miền:
const punycode = require('punycode'); // Mã hóa tên miền từ Unicode sang Punycode const domain = 'bánhcuốn.com'; const punycodeDomain = punycode.toASCII(domain); console.log('Punycode:', punycodeDomain); // Kết quả: xn--bnhcon-eba3975a // Giải mã Punycode thành tên miền Unicode const punycodeDomain2 = 'xn--bnhcon-eba3975a'; const domain2 = punycode.toUnicode(punycodeDomain2); console.log('Domain:', domain2); // Kết quả: bánhcuốn.com
Trong ví dụ trên, chúng ta import module Punycode và sử dụng hai phương thức punycode.toASCII()
và punycode.toUnicode()
để mã hóa và giải mã tên miền. Đầu tiên, chúng ta mã hóa tên miền “bánhcuốn.com” thành Punycode bằng cách sử dụng punycode.toASCII()
và in kết quả ra màn hình. Sau đó, chúng ta giải mã Punycode “xn--bnhcon-eba3975a” thành tên miền Unicode bằng punycode.toUnicode()
và in kết quả ra màn hình.
Kết quả của ví dụ trên sẽ là:
Punycode: xn--bnhcon-eba3975a Domain: bánhcuốn.com
Ví dụ trên cho thấy cách sử dụng module Punycode trong Node.js để mã hóa và giải mã tên miền Unicode, giúp làm việc với các tên miền và URL đa ngôn ngữ.