GNU Libidn is an implementation of the Stringprep, Punycode, and IDNA specifications defined by the IETF Internationalized Domain Names (IDN) working group.
It is used to prepare internationalized strings (such as domain name labels, usernames, and passwords) in order to increase the likelihood that string input and string comparison work in ways that make sense for typical users throughout the world. The library contains a generic Stringprep implementation that does Unicode 3.2 NFKC normalization, mapping and prohibition of characters, and bidirectional character handling. Profiles for iSCSI, Kerberos 5, Nameprep, SASL, and XMPP are included. Punycode and ASCII Compatible Encoding (ACE) via IDNA are supported.