利比登 1.42
GNU国际化域名库

介绍

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@米。

示例

/*example.c---演示如何使用stringprep()的示例代码。
*版权所有(C)2002-2024 Simon Josefsson
*
*此文件是GNU Libidn的一部分。
*
*这个程序是自由软件:你可以重新发布它和/或修改
*根据GNU通用公共许可证的条款
*自由软件基金会,许可证版本3,或
*(由您选择)任何更高版本。
*
*分发此程序是为了希望它会有用,
*但无任何保证;甚至没有
*适销性或特定用途的适用性。请参阅
*GNU通用公共许可证了解更多详细信息。
*
*您应该已经收到GNU通用公共许可证的副本
*与此程序一起使用。如果没有,请参阅<https://www.gnu.org/licenses网站/>.
*
*/
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
#包括<locale.h> /*setlocale()*/
/*
*建议使用libtool和pkg-config进行编译:
*
*$libtool cc-o示例.c`pkg-config--cflags--libs libidn`
* $ ./例子
*编码为“ISO-8859-1”的输入字符串:ª
*在locale2utf8之前(长度2):aa 0a
*字符串rep之前(长度3):c2 aa 0a
*stringprep后(长度2):610a
* $
*
*/
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
整数钢筋混凝土;
尺寸_ti;
设置语言环境(LC_ALL,"");
打印(“输入字符串编码为“%s”:”,字符串rep_locale_charset());
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“在locale2utf8之前(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
第页=字符串rep_locale_to_utf8(buf);
如果(p)
{
strcpy(buf,p);
自由(p);
}
其他的
打印(无法将字符串转换为UTF-8,仍在继续…\n);
打印(“在stringprep之前(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
钢筋混凝土=字符串代表(buf,BUFSIZ,0,字符串rep_nameprep);
如果(rc!)=字符串准备_确定)
打印(“Stringprep失败(%d):%s\n”,钢筋混凝土,字符串rep_strerror(钢筋混凝土);
其他的
{
打印(“在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)
定义: 图8:c:85
IDNAPI char*字符串rep_locale_to_utf8(const char*str)
定义: 头条8.c:145
@字符串准备_确定
#定义stringprep_nameprep(in,maxlen)
/*example3.c——演示如何使用Libidn的ToASCII()代码示例。
*版权所有(C)2002-2024 Simon Josefsson
*
*此文件是GNU Libidn的一部分。
*
*这个程序是自由软件:你可以重新发布它和/或修改
*它根据由
*自由软件基金会,许可证版本3,或
*(由您选择)任何更高版本。
*
*分发此程序是为了希望它会有用,
*但无任何保证;甚至没有
*适销性或特定用途的适用性。请参阅
*GNU通用公共许可证了解更多详细信息。
*
*您应该已经收到GNU通用公共许可证的副本
*与此程序一起使用。如果没有,请参阅<https://www.gnu.org/licenses网站/>.
*
*/
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
#包括<locale.h> /*setlocale()*/
#包括<字符串代表。小时> /*字符串rep_locale_charset()*/
#包括<艾德纳。小时> /*idna_to_ascii_lz()*/
/*
*建议使用libtool和pkg-config进行编译:
*
*$libtool cc-o example3示例3.c`pkg-config--cflags--libs libidn`
* $ ./示例3
*输入域编码为“ISO-8859-1”:www.räksmörgásª.example
*读取字符串(长度23):77 77 77 2e 72 e4 6b 73 6d f6 72 67 e5 73 aa 2e 65 78 61 6d 70 6c 65
*ACE标签(长度33):“www.xn--rksmrgsa-0zap8p.example”
*77 77 77 2e 78 6e 2d 72 b 73 6d 72 67 73 61 2d 30 a 61 70 e 65 78 6d 70 c 65
*$
*
*/
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
整数钢筋混凝土;
尺寸_ti;
设置语言环境(LC_ALL,"");
打印(“输入域编码为“%s”:”,字符串rep_locale_charset());
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“读取字符串(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
钢筋混凝土=idna_to_ascii_lz(buf,&p,0);
如果(rc!)=IDNA_成功)
{
打印(“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标志)
定义: idna.c:609
@IDNA_成功
定义: idna.h:74
IDNAPI常量字符*idna_strerror(idna_rc rc)
/*example4.c——演示如何使用Libidn的ToUnicode()代码示例。
*版权所有(C)2002-2024 Simon Josefsson
*
*此文件是GNU Libidn的一部分。
*
*这个程序是自由软件:你可以重新发布它和/或修改
*它根据由
*自由软件基金会,许可证版本3,或
*(由您选择)任何更高版本。
*
*分发此程序是为了希望它会有用,
*但无任何保证;甚至没有
*适销性或特定用途的适用性。请参阅
*GNU通用公共许可证了解更多详细信息。
*
*您应该已经收到GNU通用公共许可证的副本
*与此程序一起使用。如果没有,请参阅<https://www.gnu.org/licenses网站/>.
*
*/
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
#包括<locale.h> /*setlocale()*/
#包括<字符串代表。小时> /*字符串rep_locale_charset()*/
#包括<艾德纳。小时> /*idna_to_unicode()*/
/*
*建议使用libtool和pkg配置进行编译:
*
*$libtool cc-o example4示例4.c`pkg-config--cflags--libs libidn`
*美元/示例4
*输入域编码为“ISO-8859-1”:www.xn-rksmrgsa-0zap8p.example
*读取字符串(长度33):77 77 2e 78 6e 2d 72 6b 73 6d 72 67 73 61 2d 30 7a 61 70 38 70 2e 65 78 61 6d 70 6c 65
*ACE标签(长度23):“www.räksmörgása.example”
*77 77 e4 b6 d6 f6 e6 e6 e 6 e6 c6
* $
*
*/
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
整数钢筋混凝土;
尺寸_ti;
设置语言环境(LC_ALL,"");
打印(“输入域编码为“%s”:”,字符串rep_locale_charset());
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“读取字符串(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
钢筋混凝土=idna_to_unicode _lzlz(buf,&p,0);
如果(rc!)=IDNA_成功)
{
打印(“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标志)
定义: idna.c:819
/*示例5.c——TLD检查示例。
*版权所有(C)2004-2024 Simon Josefsson
*
*此文件是GNU Libidn的一部分。
*
*这个程序是自由软件:你可以重新发布它和/或修改
*它根据由
*自由软件基金会,许可证版本3,或
*(由您选择)任何更高版本。
*
*分发此程序是为了希望它会有用,
*但无任何保证;甚至没有
*适销性或特定用途的适用性。请参阅
*GNU通用公共许可证了解更多详细信息。
*
*您应该已经收到GNU通用公共许可证的副本
*与此程序一起使用。如果没有,请参阅<https://www.gnu.org/licenses网站/>.
*
*/
#包括<stdio.h>
#包括<stdlib.h>
#包括<string.h>
/*获取stringprep_locale_charset等*/
/*获取idna_to_ascii_8z等*/
/*获取tld_check_4z*/
/*
*建议使用libtool和pkg-config进行编译:
*
*$libtool cc-o example5示例5.c`pkg-config--cflags--libs libidn`
* $ ./示例5
*输入域编码为“UTF-8”:fooß.no
*读取字符串(长度8):66 6f 6f c3 9f 2e 6e 6f
*ToASCII字符串(长度8):fooss.no
*ToUnicode字符串:U+0066 U+006f U+006fU+0073U+0073 U+002e U+006e U+0006f
*TLD检查接受的域
*
*美元/示例5
*编码为“UTF-8”的输入域:gr€€n.no
*读取字符串(长度12):67 72 e2 82 ac e2 82 ac 6e 2e 6e 6f
*ToASCII字符串(长度16):xn-grn-l50aa.no
*ToUnicode字符串:U+0067 U+0072 U+20ac U+20ac U+006e U+002e U+006e U+006f
*TLD检查拒绝的域,Unicode位置2
*
*/
整数
主要(空隙)
{
烧焦buf[BUFSIZ];
烧焦*p;
uint32_t*r;
整数钢筋混凝土;
尺寸_t错误,i;
打印(“输入域编码为“%s”:”,字符串rep_locale_charset());
fflush(标准输出);
如果(!fgets(buf,BUFSIZ,stdin))
倒霉(“功能设置”);
buf[字符串(buf)-1]='\0';
打印(“读取字符串(长度%ld):”, (长的 整数)strlen(buf));
对于(i=0;i<strlen(buf);i++)
打印(“%02x”, (无符号的)buf[i]&0xFF);
打印(“\n”);
第页=字符串rep_locale_to_utf8(buf);
如果(p)
{
strcpy(buf,p);
自由(p);
}
其他的
打印(无法将字符串转换为UTF-8,仍在继续…\n);
钢筋混凝土=idna_to_ascii_8z(buf,&p,0);
如果(rc!)=IDNA_成功)
{
打印(“idna_to_ascii_8z失败(%d):%s\n”,钢筋混凝土,idna存储错误(钢筋混凝土);
返回2;
}
打印(“ToASCII字符串(长度%ld):%s\n”, (长的 整数)strlen(p),p);
钢筋混凝土=idna_to_unicode 8z4z(p,&r,0);
自由(p);
如果(rc!)=IDNA_成功)
{
打印(“idna_to_unicode_8z4z失败(%d):%s\n”,
钢筋混凝土,idna存储错误(钢筋混凝土);
返回2;
}
打印(“ToUnicode字符串:”);
对于(i=0;r[i];i++)
打印(“U+%04x”,r[i]);
打印(“\n”);
钢筋混凝土=tld检查4z(r,&errpos,空);
自由(r);
如果(钢筋混凝土==TLD_无效)
{
打印(TLD检查拒绝了域,Unicode位置%ld\n,
(长的 整数)errpos);
返回1;
}
其他的 如果(rc!)=TLD成功)
{
打印(“tld_check_4z()失败(%d):%s\n”,钢筋混凝土,tldstrerror错误(钢筋混凝土);
返回2;
}
打印(“TLD检查接受的域\n”);
返回0;
}
int idna_to_ascii_8z(const char*输入,char**输出,int标志)
定义: idna.c:576
int idna_to_unicode 8z4z(const字符*输入,uint32_t**输出,int标志)
定义: idna.c:719
const char*tld_sterror(tld_rc rc)
int tld_check_4z(const uint32_t*in,size_t*errpos,const tld_table**覆盖)
@TLD_成功
@TLD_无效