What is punycode?
The punycode npm package is a robust library for encoding and decoding Unicode with Punycode. It's useful for internationalization and handling Unicode domain names and email addresses.
What are punycode's main functionalities?
Encoding to Punycode
Converts a Unicode string to a Punycode string (ASCII). Mainly used for domain names.
punycode.encode('mañana') // => 'maana-pta'
Decoding from Punycode
Converts a Punycode string (ASCII) back to a Unicode string. Useful for displaying human-readable text.
punycode.decode('maana-pta') // => 'mañana'
Unicode to ASCII conversion for domain names
Converts a Unicode domain name to an ASCII-compatible encoding (ACE) domain name.
punycode.toASCII('español.example.com') // => 'xn--espaol-zwa.example.com'
ASCII to Unicode conversion for domain names
Converts an ASCII-compatible encoding (ACE) domain name back to a Unicode domain name.
punycode.toUnicode('xn--espaol-zwa.example.com') // => 'español.example.com'
Other packages similar to punycode
idna-uts46-hx
A library that implements IDNA (Internationalized Domain Names in Applications) to Punycode conversion using the latest Unicode version. It's similar to punycode but follows the IDNA 2008 protocol, which is more up-to-date compared to the IDNA 2003 protocol that punycode follows.
Punycode.js
A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.
This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm:
This project is bundled with Node.js v0.6.2+.
Installation
Via npm (only required for Node.js releases older than v0.6.2):
npm install punycode
Via Bower:
bower install punycode
Via Component:
component install bestiejs/punycode.js
In a browser:
<script src="punycode.js"></script>
In Narwhal, Node.js, and RingoJS:
var punycode = require('punycode');
In Rhino:
load('punycode.js');
Using an AMD loader like RequireJS:
require(
{
'paths': {
'punycode': 'path/to/punycode'
}
},
['punycode'],
function(punycode) {
console.log(punycode);
}
);
API
punycode.decode(string)
Converts a Punycode string of ASCII symbols to a string of Unicode symbols.
punycode.decode('maana-pta');
punycode.decode('--dqo34k');
punycode.encode(string)
Converts a string of Unicode symbols to a Punycode string of ASCII symbols.
punycode.encode('mañana');
punycode.encode('☃-⌘');
punycode.toUnicode(domain)
Converts a Punycode string representing a domain name to Unicode. Only the Punycoded parts of the domain name will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode.
punycode.toUnicode('xn--maana-pta.com');
punycode.toUnicode('xn----dqo34k.com');
punycode.toASCII(domain)
Converts a Unicode string representing a domain name to Punycode. Only the non-ASCII parts of the domain name will be converted, i.e. it doesn’t matter if you call it with a domain that's already in ASCII.
punycode.toASCII('mañana.com');
punycode.toASCII('☃-⌘.com');
punycode.ucs2
punycode.ucs2.decode(string)
Creates an array containing the numeric code point values of each Unicode symbol in the string. While JavaScript uses UCS-2 internally, this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16.
punycode.ucs2.decode('abc');
punycode.ucs2.decode('\uD834\uDF06');
punycode.ucs2.encode(codePoints)
Creates a string based on an array of numeric code point values.
punycode.ucs2.encode([0x61, 0x62, 0x63]);
punycode.ucs2.encode([0x1D306]);
punycode.version
A string representing the current Punycode.js version number.
Full API documentation is available.
Unit tests & code coverage
After cloning this repository, run npm install --dev
to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul globally using npm install istanbul -g
.
Once that’s done, you can run the unit tests in Node using npm test
or node tests/tests.js
. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use grunt test
.
To generate the code coverage report, use grunt cover
.
Feel free to fork if you see possible improvements!
Author
Contributors
License
Punycode.js is dual licensed under the MIT and GPL licenses.