介绍
GNU Libidn是IETF国际化域名(IDN)工作组定义的Stringprep、Punycode和IDNA规范的实现,用于国际化域名。该软件包在GNU Lesser General Public License下提供。
该库包含一个通用的Stringprep实现,该实现执行Unicode 3.2 NFKC规范化、字符映射和禁止以及双向字符处理。包括Nameprep、iSCSI、SASL和XMPP的配置文件。支持通过IDNA的Punycode和ASCII兼容编码(ACE)。其中包括一种机制,用于定义顶级域(TLD)特定的验证表,并将字符串与这些表进行比较。还包括一些TLD的默认表。
Stringprep API由两个主要函数组成,一个用于将数据从系统的本机表示转换为UTF-8,另一个用于执行Stringprep处理。在API中为应用程序添加新的Stringprep配置文件很简单。Punycode API由一个编码函数和一个解码函数组成。IDNA API包括ToASCII和ToUnicode函数,以及用于将整个域名转换为ACE编码形式和从ACE编码形式转换整个域名的高级接口。TLD API包括一组从域字符串中提取TLD名称的函数,一组根据TLD名称定位要使用的适当TLD表的函数,和核心函数来根据TLD表验证字符串,以及一些实用程序包装器来在一次调用中执行所有步骤。
GNU SASL和Shishi等使用该库来处理用户名和密码。可以将Libidn内置到GNU Libc中,以便为IDN处理启用新的系统范围getaddrinfo()标志。
Libidn是为GNU/Linux系统开发的,但在20多个Unix平台(包括Solaris、IRIX、AIX和Tru64)和Windows上运行。Libidn是用C编写的,API的(部分)可以从C、C++、Emacs Lisp、Python和Java访问。
项目网页:
https://www.gnu.org/software/libidn/
软件存档:
网址://alpha.gnu.org/pub/gnu/libidn/
有关更多信息,请参阅:
http://www.ietf.org/html.charters/idn-charter.html
http://www.ietf.org/rfc/rfc3454.txt(stringprep规范)
http://www.ietf.org/rfc/rfc3490.txt(idna规范)
http://www.ietf.org/rfc/rfc3491.txt(nameprep规范)
http://www.ietf.org/rfc/rfc3492.txt(punycode规范)
http://www.ietf.org/internet-drafts/draft-ietf-ips-iscsi-string-prep-04.txt
http://www.ietf.org/internet-drafts/draft-ietf-krb-wg-utf8-profile-01.txt
http://www.ietf.org/internet-drafts/draft-ietf-sasl-anon-00.txt
http://www.ietf.org/internet-drafts/draft-ietf-sasl-saslprep-00.txt
http://www.ietf.org/internet-drafts/draft-ietf-xmpp-nodeprep-01.txt
http://www.ietf.org/internet-drafts/draft-ietf-xmpp-resourceprep-01.txt
更多信息和付费合同开发:
西蒙·约瑟夫森西蒙.nosp@米。@乔斯.nosp@米。efsso公司.nosp@米。n.或.nosp@米。克
示例
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
#包括<locale.h>
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
整数钢筋混凝土;
尺寸_ti;
设置语言环境(LC_ALL,"");
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“在locale2utf8之前(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
如果(p)
{
strcpy(buf,p);
自由(p);
}
其他的
打印(无法将字符串转换为UTF-8,仍在继续…\n);
打印(“在stringprep之前(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
其他的
{
打印(“在stringprep之后(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
}
返回0;
}
const char*stringprep_strerror(stringprep_rc rc)
int字符串rep(char*in,size_t maxlen,stringprep_profile_flags标志,const stringprep_profile*配置文件)
IDNAPI const char*字符串rep_locale_charset(void)
IDNAPI char*字符串rep_locale_to_utf8(const char*str)
#定义stringprep_nameprep(in,maxlen)
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
#包括<locale.h>
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
整数钢筋混凝土;
尺寸_ti;
设置语言环境(LC_ALL,"");
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“读取字符串(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
{
打印(“ToASCII()失败(%d):%s\n”,钢筋混凝土,idna存储错误(钢筋混凝土);
返回退出失败;
}
打印(“ACE标签(长度%ld):'%s'\n”, (长的 整数)strlen(p),p);
对于(i=0;i<strlen(p);i++)
打印(“%02x”, (无符号的)p[i]&0xFF);
打印(“\n”);
自由(p);
返回0;
}
int idna_to_ascii_lz(const char*输入,char**输出,int标志)
IDNAPI常量字符*idna_strerror(idna_rc rc)
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
#包括<locale.h>
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
整数钢筋混凝土;
尺寸_ti;
设置语言环境(LC_ALL,"");
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“读取字符串(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
{
打印(“ToUnicode()失败(%d):%s\n”,钢筋混凝土,idna存储错误(rc));
返回退出失败;
}
打印(“ACE标签(长度%ld):“%s”\n”, (长的 整数)strlen(p),p);
对于(i=0;i<strlen(p);i++)
打印(“%02x”, (无符号的)p[i]&0xFF);
打印(“\n”);
自由(p);
返回0;
}
int idna_to_unicode _lzlz(const char*输入,char**输出,int标志)
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
uint32_t*r;
整数钢筋混凝土;
尺寸_t错误,i;
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“读取字符串(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
如果(p)
{
strcpy(buf,p);
自由(p);
}
其他的
打印(无法将字符串转换为UTF-8,仍在继续…\n);
{
打印(“idna_to_ascii_8z失败(%d):%s\n”,钢筋混凝土,idna存储错误(钢筋混凝土);
返回2;
}
打印(“ToASCII字符串(长度%ld):%s\n”, (长的 整数)strlen(p),p);
自由(p);
{
打印(“idna_to_unicode_8z4z失败(%d):%s\n”,
返回2;
}
打印(“ToUnicode字符串:”);
对于(i=0;r[i];i++)
打印(“U+%04x”,r[i]);
打印(“\n”);
自由(r);
{
打印(TLD检查拒绝了域,Unicode位置%ld\n,
(长的 整数)errpos);
返回1;
}
{
返回2;
}
打印(“TLD检查接受的域\n”);
返回0;
}
int idna_to_ascii_8z(const char*输入,char**输出,int标志)
int idna_to_unicode 8z4z(const字符*输入,uint32_t**输出,int标志)
const char*tld_sterror(tld_rc rc)
int tld_check_4z(const uint32_t*in,size_t*errpos,const tld_table**覆盖)