GNU图书馆1.42

下一步:,向上:(目录)  [目录][索引]

GNU图书馆

本手册最新更新版本为2024年1月12日GNU Libidn的1.42。

版权所有©2002–2024 Simon Josefsson。

授予复制、分发和/或修改本文件的权限根据GNU免费文档许可证1.3版的条款或自由软件基金会发布的任何更新版本;没有不变的节,没有前覆盖文本,也没有后覆盖文本。A类许可证副本包含在标题为“GNU Free”的部分中文档许可”。

目录


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

1引言

GNU Libidn是Stringprep的一个有完整文档记录的实现,Punycode和IDNA规范。Libidn的目的是编码和解码国际化域名字符串。有本机C、C#和Java库。

C库包含一个通用的Stringprep实现。配置文件对于Nameprep,包括iSCSI、SASL、XMPP和Kerberos V5。支持通过IDNA的Punycode和ASCII兼容编码(ACE)。定义顶级域(TLD)特定验证的机制表,并将字符串与这些表进行比较。还包括一些TLD的默认表。

Stringprep API包含两个主要函数,一个用于转换数据从系统的本机表示转换为UTF-8函数执行Stringprep处理。添加新的API中应用程序的Stringprep配置文件是简单明了。Punycode API由一个编码函数组成和一个解码功能。IDNA API由ToASCII和ToUnicode函数,以及用于转换的高级接口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。这个库是用C编写的,API的(部分)也可以从C++、Emacs Lisp、Python和Java。本机Java和C#端口是包括。

还包括一个命令行工具、几个自检、代码示例等。


下一步:,向上:介绍  [目录][索引]

1.1入门

本手册记录了库编程接口。全部解释了该库提供的功能和数据类型。还包括命令行的示例和文档工具idn公司为库提供快速接口。这个还讨论了该库的Emacs Lisp绑定。

假定读者基本熟悉C或C++中的国际化概念和网络编程。

本手册有多种使用方式。如果从头开始阅读最后,它很好地介绍了图书馆以及如何可以在应用程序中使用。其中包括远期参考必要的。稍后,该手册可作为参考手册,用于只需获取有关库。经验丰富的程序员可能想开始关注手册末尾的示例(参见示例),然后仅阅读界面中那些不清楚的部分。


下一步:,上一个:,向上:介绍  [目录][索引]

1.2特点

与其他库相比,此库可能有一些优势做类似的工作。

这是自由软件

任何人都可以在免费的条款下使用、修改和重新分发它软件许可证。

它是螺纹安全的

库中没有保存全局状态。所有函数都是可重入的。

它是便携式的

该代码旨在使用纯ANSI C89编写。一直以来在许多类似Unix的操作系统和Windows上进行了测试。

它是模块化的

该库由几个模块组成模块之间通过每个模块的公共API。如果你只需要作为一项功能,您可以获取所需的文件并将其纳入您自己的项目中。

它没有膨胀

库的设计基于所需的最小API实现基本功能。它已经被小心地扩展了用少量高级包装纸使其舒适使用库。然而,它没有实现额外的功能只是为了完整。

有记录在案

遗憾的是,目前并非所有软件都附带文档。这个做。


下一步:,上一个:,向上:介绍  [目录][索引]

1.3图书馆概述

下图显示了组成Libidn的组件,以及应用程序与库的关系。在图示中,各种组件显示为方框。您可以看到通用StringPrep组件、各种StringPrep配置文件,包括Nameprep、Punycode组件、IDNA组件和TLD组件。这个箭头表示聚合,例如,IDNA使用Punycode和Nameprep,而Nameprep则使用通用的StringPrep接口。这个所有组件的接口都可用于应用程序,没有库中的组件对应用程序是隐藏的。

libidn-组件

下一步:,上一个:,向上:介绍  [目录][索引]

1.4支持的平台

Libidn在某个时间点对以下内容进行了测试平台。为每个平台和Libidn版本生成报告可在获取http://autobuild.josefsson.org/libidn/.

  1. Debian GNU/Linux 3.0(Woody)

    GCC 2.95.4和GNU品牌。这是主要的开发平台。alphaev67未知linux-gnu,alphaev6未知linux gnu,arm未知linux gnu,armv4l-未知-linux-gnu,hppa-未知-linux-gnu,hppa64未知linux-gnu,i686-pc-linux-gnu,ia64未知linux-gnu,m68k-未知-linux-gnu,mips未知linux-gnu,mipsel-unknown-linux-gnu公司,powerpc未知linux-gnu,s390-ibm-linux-gnu,sparc-未知-linux-gnu,sparc64未知linux gnu.

  2. Debian GNU/Linux 2.1

    GCC 2.95.1和GNU品牌。armv4l-未知-linux-gnu.

  3. Tru64 UNIX

    Tru64 UNIX C编译器和Tru64 Make。alphaev67-dec-osf5.1,alphaev68-dec-osf5.1.

  4. SuSE Linux 7.1

    GCC 2.96和GNU品牌。alphaev6未知linux gnu,alphaev67未知linux-gnu.

  5. SuSE Linux 7.2a版

    GCC 3.0和GNU品牌。ia64未知linux-gnu.

  6. SuSE Linux

    GCC 3.2.2和GNU品牌。x86_64未知linux-gnu(AMD64Opteron“Melody”)。

  7. IBM OpenPower 720上的SuSE Enterprise Server 9

    GCC 3.3.3和GNU品牌。powerpc64未知linux-gnu.

  8. RedHat Linux 7.2

    GCC 2.96和GNU品牌。alphaev6未知linux gnu,alphaev67未知linux-gnu,ia64未知linux-gnu.

  9. RedHat Linux 8.0

    GCC 3.2和GNU品牌。i686-pc-linux-gnu.

  10. RedHat高级服务器2.1

    GCC 2.96和GNU品牌。i686-pc-linux-gnu.

  11. Linux 8.0.01 Slackware

    通用条款2.95.3和GNU Make。i686-pc-linux-gnu.

  12. Mandrake Linux 9.0版

    GCC 3.2和GNU品牌。i686-pc-linux-gnu.

  13. IRIX 6.5版

    MIPS C编译器,IRIX Make。mips-sgi-irix6.5.

  14. AIX 4.3.2

    IBM C for AIX编译器,AIX Make。rs6000-ibm-aix4.3.2.0.

  15. Microsoft Windows 2000(Cygwin)

    GCC 3.2,GNU制造。i686-pc-cygwin.

  16. HP-UX 11

    HP-UX C编译器和HP Make。ia64-hp-hpux11.22,hppa2.0w-hp-hpux11.11型.

  17. SUN Solaris 2.7

    GCC 3.0.4和GNU品牌。sparc-sun-solaris2.7.

  18. SUN Solaris 2.8

    Sun WorkShop编译器C 6.0和Sun Make。sparc-sun-solaris2.8.

  19. SUN Solaris 2.9

    Sun Forte Developer 7 C编译器和GNU品牌。sparc-sun-solaris2.9.

  20. NetBSD 1.6版

    通用条款2.95.3和GNU Make。alpha-unknown-netbsd1.6,i386-unknown-netbsdelf1.6.

  21. OpenBSD 3.1和3.2

    通用条款2.95.3和GNU Make。alpha-未知-打开bsd3.1,i386-未知-打开bsd3.1.

  22. FreeBSD 4.7和4.8

    GCC 2.95.4和GNU品牌。α-未知-无bsd4.7,α-未知-无bsd4.8,i386-未知自由bsd4.7,i386-未知-免费bsd4.8.

  23. MacOS X 10.2服务器版

    GCC 3.1和GNU品牌。powerpc-apple-darwin6.5.

  24. MacOS X 10.4“老虎”与Xcode 2.0

    GCC 4.0和GNU品牌。powerpc应用程序-达尔文8.0.

  25. 在摩托罗拉Coldfire上交叉编译到uClinux/uClibc

    GCC 3.4和GNU品牌m68k-uclinux小精灵.

  26. 使用Glibc交叉编译到ARM

    GCC 2.95和GNU品牌嵌入式系统.

  27. 交叉编译为Mingw32。

    GCC 3.4.4和GNU品牌i586-mingw32msvc.

  28. 操作系统/2

    通用条款。

如果您在新平台上使用Libidn或将Libidn端口连接到新平台,请报告给作者。


下一步:,上一个:,向上:介绍  [目录][索引]

1.5寻求帮助

存在Libidn用户可以互相帮助的邮件列表,以及您可以发送电子邮件至help-libidn@gnu.org.邮件列表讨论的存档和管理界面订阅,可通过万维网访问http://lists.gnu.org/mailman/listinfo/help-libin.


下一步:,上一个:,向上:介绍  [目录][索引]

1.6商业支持

GNU Libidn的用户可以获得商业支持。那种可以购买的支持可能包括:

  • 实施新功能。例如国家代码特定的分析,以支持受限子集Unicode的。
  • 将Libidn端口连接到新平台。这可能包括将Libidn移植到嵌入式平台需要内存或大小优化。
  • 在现有项目中集成IDN支持。
  • IDN相关组件的系统设计。

如果您感兴趣,请写信给:

Simon Josefsson Datakonsult AB公司哈加加坦24113 47斯德哥尔摩瑞典电子邮件:simon@josefsson.org

如果贵公司提供与GNU Libidn相关的支持,并希望如需在此处提及,请联系作者(参见错误报告).


下一步:,上一个:,向上:介绍  [目录][索引]

1.7下载和安装

该软件包可以从多个地方下载,包括:

网址://alpha.gnu.org/pub/gnu/libidn/

最新版本存储在文件中,例如。,libidn-1.42.tar.gz数据库'其中'1.42value是目录中的最高版本号。

然后像其他许多软件一样提取、配置和构建包使用Autoconf的包。有关配置的详细信息以及建造它,请参阅安装属于分发存档。

下面是一个下载、配置、构建的终端会话示例并安装软件包。您需要一些基本工具,例如第页’, ‘制作'和'复写的副本’.

$wget-q美元网址://alpha.gnu.org/pub/gnu/libidn/libidn-1.42.tar.gz$tar xfz性欲-1.42.tar.gz$cd libidn-1.42/$ ./配置...$制造...$make安装...

之后,Libidn应正确安装并准备好使用。

少许配置选项可能相关,总结在表。

--启用-java

将Java端口构建为*。JAR文件。请参见应用程序接口,了解更多信息。

--禁用标签

禁用TLD模块。这通常只有在您正在内存受限的平台上构建。请参见TLD函数,了解更多信息。

--启用csharp[=IMPL]

构建C类#端口到*.动态链接库文件。请参见C#API,用于更多信息。在这里,IMPL(机具)pnet(网络)单声道,指示PNET是否中国安全通信委员会编译器或Monomcs公司应该分别使用编译器。

--禁用验证测试

禁用在Valgrind下运行自检(http://valgrind.org/). 通常Valgrind不会导致并可以检测到一些严重的内存错误。如果你得到由编译器或libc(可能作为特殊优化标志的结果),可以使用此选项禁用Valgrind。

有关完整列表,请参阅配置--帮助.


向上:下载和安装  [目录][索引]

1.7.1在Windows下安装

有两种方法可以在Windows上构建Libidn:通过MinGW或通过Visual工作室。

使用MinGW,您可以构建Libidn DLL并从其他应用。安装MinGW后(网址:http://mingw.org/)跟随通用安装说明(请参见下载和安装). 默认情况下安装DLL。

有关如何在其他应用程序中使用DLL的信息,请参阅:http://www.mingw.org/mingwfaq.shtml常见问题-msvcdll.

您可以将Libidn构建为本机Visual Studio C++项目。这个允许您为VS支持的其他平台构建代码,例如Windows Mobile。您需要Visual Studio 2005或更高版本。

首先按照通用安装说明(请参见下载和安装). 不要这样运行./配置。相反,请启动Visual Studio并打开项目文件windows/libidn.sln在Libidn目录中。应该能够使用生成项目生成项目。

输出库将写入windows/lib窗口(或windows/lib/debug对于调试版本)文件夹。

使用Windows时,您可能需要查看特殊内存处理可能需要的功能(请参阅Windows下的内存处理).


下一步:,上一个:,向上:介绍  [目录][索引]

1.8错误报告

如果您认为您在Libidn中发现了一个错误,请进行调查并报告它。

  • 请确保该错误确实存在于Libidn中,并且最好还检查它是否在最新版本中已经修复版本。
  • 您必须向我们发送一个测试用例,以便我们能够重现错误。
  • 你还必须解释什么是错误的;如果你撞车了,或者如果打印的结果不好,在这种情况下,以什么方式。确保错误报告包含您需要的所有信息为别人修复这种错误。

请尽力制作一份独立的报告可以测试或调试的明确的东西。模糊查询或零碎的信息很难付诸行动,也无助于开发工作。

如果您的错误报告良好,我们将尽力帮助您获得软件的修正版本;如果错误报告不好,我们不会对此做任何事情(除了要求你发送更好的错误报告)。

如果您认为本手册中的某些内容不清楚或完全正确不正确,或者如果语言需要改进,请同时发送注意。

将错误报告发送至:

bug-libidn@gnu.org

上一页:,向上:介绍  [目录][索引]

1.9贡献

如果你想提交一个补丁以供包含——从解决输入错误开始发现,直到添加对新功能的支持–您应该将其作为错误报告提交(请参见错误报告). 有一些你可以做些什么来增加它被包括在内的机会在官方包装中。

除非你的补丁很小(比如10行以下),否则我们需要您将您的作品的版权分配给自由软件基金会。这是为了保护项目的自由。如果你没有已经签署了文件,我们将在你提交你的贡献。

对于不包含实际编程代码的贡献唯一的准则是常识。使用它。

对于代码贡献,一些样式指南将帮助您:

  • 编码样式。遵循GNU标准文档(参见(标准)GNU编码标准).

    如果您通常使用其他编码标准进行编码,则没有问题,但您应该使用“缩进'重新格式化代码(请参见(缩进)GNU缩进)在提交工作之前。

  • 使用统一的diff格式差异-u’.
  • 返回错误。任何理由都不应中止库的执行。偶数内存分配错误(例如,当malloc返回NULL时)应该有效尽管会导致错误代码。
  • 设计时考虑螺纹安全。不要使用全局变量等。
  • 避免使用C数学库。它会给嵌入式实现带来问题,而且在大多数情况下情况很容易避免使用它。
  • 记录您的功能。在每个函数头之前使用注释,如果正确的话格式,提取到GTK-DOC网页。别忘了同时更新Texinfo手册。
  • 酌情提供ChangeLog和NEWS条目。

下一步:,上一个:,向上:GNU图书馆  [目录][索引]

2准备

要使用“Libidn”,您必须对源代码和构建系统。必要的更改很小,请参见以下各节。在本章末尾,将对其进行描述库是如何初始化的,以及库已验证。

找到如何调整应用程序以与一起使用的更快方法“Libidn”可以查看本手册末尾的示例(请参见示例).


下一步:,上一个:,向上:准备  [目录][索引]

2.2初始化

Libidn是无状态的,不需要任何初始化。


下一步:,上一个:,向上:准备  [目录][索引]

2.3版本检查

通常需要检查使用的“Libidn”版本是否为事实上,它符合所有要求。即使使用二进制兼容性可能引入了新功能,但由于问题在动态链接器中,实际使用的是旧版本。所以你可以希望在程序启动后立即检查版本是否正常。

字符串rep_check_version

功能:常量字符* 字符串rep_check_version (常量字符*请求版本)

请求版本:必需的版本号,或NULL。

检查库的版本是否至少为请求的版本并返回版本字符串;如果条件不是,则返回NULL满意的。如果将NULL传递给此函数,则不执行任何检查,但只返回版本字符串。

请参见字符串预览_版本适用于请求版本字符串。

返回值:运行时库的版本字符串,如果运行时库不符合所需的版本号。

使用该函数的常规方法是将类似于在您的主要的:

if(!stringprep_check_version(stringprep_version)){printf(“stringprep_check_version()失败:\n”“头文件与共享库不兼容。\n”);退出(exit_FAILURE);}

下一步:,上一个:,向上:准备  [目录][索引]

2.4构建源

如果要编译包含例如“idna.h”头的源文件文件,必须确保编译器可以在目录层次结构。通过将路径添加到头文件所在的编译器目录包括文件搜索路径(通过-我选项)。

但是,包含文件的路径是在源已配置。为了解决这个问题,“Libidn”使用外部包装pkg配置知道通往包括文件和其他配置选项。需要的选项在编译时添加到编译器调用中的这个--cf标记选择pkg-config库ID. The以下示例显示了如何在命令行中使用它:

gcc-c foo.c`pkg-config libidn--cflags`

正在添加“”的输出pkg-config libidn—标记'到编译器命令行将确保编译器可以找到例如idna.h头文件。

将程序与库链接时会出现类似的问题。同样,编译器必须找到库文件。要使其发挥作用,库文件的路径必须添加到库搜索中路径(通过-我选项)。为此,选项--利比亚银行pkg-config库ID可以使用。对于方便,此选项还输出以下所有其他选项需要将程序链接到“libidn”库。这个例子显示如何链接食品。o(o)将“libidn”库添加到程序foo公司.

gcc-o foo foo.o`pkg-config libidn--库`

当然,您也可以通过以下方式将这两个示例组合到一个命令中将这两个选项指定为pkg配置:

gcc-o foo foo.c `pkg配置libidn-cflags-libs`

下一步:,上一个:,向上:准备  [目录][索引]

2.5自动控制测试

如果您的项目使用Autoconf(请参见(autoconf)GNU autoconf)要检查已安装的库,您可能会发现以下代码片段说明性的。它添加了一个新配置参数--含利宾,并检查艾德纳。小时和'-利登(可能位于指定为--含利宾),并定义CPP符号LIBIDN银行如果找到库。默认行为是搜索库并在库,但如果您希望使您的软件包没有使用Libidn(即使它安装在系统),更改'libidn=是'至'libidn=否'第三次行。

AC_ARG_WITH(libidn,AS_HELP_STRING([--WITH-libindn=[DIR]],[支持IDN(需要GNU Libidn)]),libidn=$withval,libidn=是)如果测试“$libidn”!=“否”;然后如果测试“$libidn”!=“是”;然后LDFLAGS=“${LDFLAGS}-L$libidn/lib”CPPFLAGS=“${CPPFLAGS}-I$libidn/include”fi(菲涅耳)AC_CHECK_HEADER(idna.h,AC_CHECK_LIB(idn,字符串rep_CHECK_version,[libidn=yes LIBS=“${LIBS}-lindn”],libidn=否),libidn=否)fi(菲涅耳)如果测试“$libidn”!=“否”;然后AC_DEFINE(LIBIDN,1,[如果需要IDN支持,请定义为1。])其他的AC_MSG_WARN([未找到库])fi(菲涅耳)AC_MSG_CHECKING([如果应使用Libidn])AC_MSG_RESULT($libidn)

如果您要求用户已安装pkg配置(其中我一般不推荐),上述操作可以更容易地完成跟随。

AC_ARG_WITH(libidn,AS_HELP_STRING([--WITH-libindn=[DIR]],[支持IDN(需要GNU Libidn)]),libidn=$withval,libidn=是)如果测试“$libidn”!=“否”;然后PKG_CHECK_MODULES(LIBIDN,力比登>=0.0.0,[力比登=是],[力比登=否])如果测试“$libidn”!=“是”;然后libidn=否AC_MSG_WARN([未找到库])其他的libidn=是AC_DEFINE(LIBIDN,1,[如果需要LIBIDN,请定义为1。])fi(菲涅耳)fi(菲涅耳)AC_MSG_CHECKING([如果应使用Libidn])AC_MSG_RESULT($libidn)

上一页:,向上:准备  [目录][索引]

2.6 Windows下的内存处理

库中的几个函数分配内存。记忆是预计将使用自由的功能。低于Windows中,有时需要在同一内存中取消分配内存分配内存区域的模块。原因是不同的模块使用单独的堆内存区域。为了解决这个问题,我们提供一个函数来取消分配库中的内存。

请注意,如果您这样做,我们一般不建议使用此界面不关心Windows的可移植性。

2.7头文件idn-free。小时

要使用本章中介绍的函数,您需要包括文件idn-free。小时使用:

#包括<idn-free.h>

2.8内存取消分配功能

idn免费

功能:空隙 idn免费 (无效*脉冲重复频率)

脉冲重复频率:要取消分配的内存区域,或无效的.

通过调用释放内存区域免费().如果脉冲重复频率无效的执行操作。

通常应用程序取消分配libidn分配的字符串打电话自由()直接。在Windows下同一个应用程序可能使用不同的堆内存释放同一模块内分配的内存很重要分配给它的。此函数使之成为可能。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

3实用程序功能

该库的其余部分广泛使用了Unicode字符。为了将此库与外部世界连接,您的应用程序可能需要进行各种Unicode转换。

3.1头文件字符串代表。小时

要使用本章中介绍的功能,您需要包括文件字符串代表。小时使用:

#包括<stringprep.h>

3.2 Unicode编码转换

字符串rep_unichar_to_utf8

功能:整数 字符串rep_unichar_to_utf8 (单位32_tc(c),字符*外buf)

c(c):ISO10646字符代码

外buf:输出缓冲区,必须至少有6个字节的空间。如果无效的,将计算并返回长度什么都不会写外buf.

将单个字符转换为UTF-8。

返回值:写入的字节数。

字符串rep_utf8_to_unichar

功能:单位32_t 字符串rep_utf8_to_unichar (常量字符*第页)

第页:指向编码为UTF-8的Unicode字符的指针

将编码为UTF-8的字节序列转换为Unicode字符。如果第页未指向有效的UTF-8编码字符,结果为未定义。

返回值:结果字符。将编码为UTF-8的字节序列转换为Unicode字符。如果第页未指向有效的UTF-8编码字符,结果为未定义。

返回值:结果字符。

字符串rep_ucs4_to_utf8

功能:字符* 字符串rep_ucs4_to_utf8 (常数uint32_t*字符串,ssize_t伦恩,大小_t*items_read(项目_读取),大小_t*项目_已写入)

字符串:UCS-4编码字符串

伦恩:的最大长度字符串使用。如果伦恩<0,则字符串以0字符结尾。

items_read(项目_读取):存储读取的字符数的位置,或无效的.

已写入项目:存储写入字节数的位置或无效的.此处存储的值不包括尾随的0字节。

将32位固定宽度表示形式中的字符串转换为UCS-4。到UTF-8。结果将以0字节结束。

返回值:指向新分配的UTF-8字符串的指针。此值必须由调用方释放。如果发生错误,无效的将返回。

字符串rep_utf8_to_ucs4

功能:单位32_t* 字符串rep_utf8_to_ucs4 (常量字符*字符串,ssize_t伦恩,大小_t*项目_已写入)

字符串:UTF-8编码字符串

伦恩:的最大长度字符串使用。如果伦恩<0,则字符串以nul结尾。

项目_已写入:location,用于存储结果,或无效的.

将字符串从UTF-8转换为32位固定宽度表示作为UCS-4。该函数现在执行错误检查以验证输入是有效的UTF-8(在它被记录为不出错之前检查)。

返回值:指向新分配的UCS-4字符串的指针。此值必须由调用方释放。

3.3 Unicode规范化

字符串rep_ucs4_nfkc_normalize

功能:单位32_t* 字符串rep_ucs4_nfkc_normalize (常数uint32_t*字符串,ssize_t伦恩)

字符串:Unicode字符串。

伦恩:的长度字符串数组,如果为-1字符串以nul结尾。

将UCS4字符串转换为规范形式,请参见字符串rep_utf8_nfkc_normalize()了解更多信息。

返回值:新分配的Unicode字符串,即NFKC规范化形式字符串.

字符串rep_utf8_nfkc_normalize

功能:字符* 字符串rep_utf8_nfkc_normalize (常量字符*字符串,ssize_t伦恩)

字符串:UTF-8编码字符串。

伦恩:的长度字符串,单位为字节,如果为-1字符串以nul结尾。

将字符串转换为规范形式,标准化比如一个有口音的角色表示为基本字符并组合重音或作为单个预编字符。

规范化模式为NFKC(ALL COMPOSE)。它实现了标准化不影响文本内容的差异,例如上述重音表示。它使Unicode中的“兼容性”字符,例如SUPERSCRIPT THREE到标准格式(在本例中为数字三)。格式化信息可能会丢失,但对于大多数文本操作,例如字符应视为相同。它返回一个结果组合形式而不是最大分解形式。

返回值:新分配的字符串,即NFKC标准化形式字符串.

3.4字符集转换

字符串rep_locale_charset

功能:常量字符* 字符串rep_locale_charset (空隙)

TLD检查函数的枚举返回码。值0保证始终对应于成功。

:找出当前的语言环境字符集。该函数与CHARSET有关环境变量,但通常在以下情况下使用nl_langinfo(CODESET)它是受支持的。如果未设置CHARSET,则返回“ASCII”nllanginfo不受支持或返回任何内容。

注意,此函数返回应用程序的首选语言环境字符集(或线程区域设置的首选字符集,如果您的系统支持特定于线程的区域设置)。它不返回系统可能正在使用。因此,如果您从外部接收数据通常无法使用此函数猜测编码的字符集。从外部使用stringprep_convert表示为该函数返回的字符集,以便区域设置编码中的数据。

返回值:返回当前区域设置使用的字符集。它永远不会返回NULL,而是使用“ASCII”作为回退。

字符串rep_convert

功能:字符* 字符串rep_convert (常量字符*字符串,常量字符*to_取消设置,常量字符*从_取消设置)

字符串:输入以零结尾的字符串。

to_取消设置:目标字符集的名称。

从_取消设置:原始字符集的名称,由使用字符串.

使用系统的iconv()功能。

返回值:返回新分配的以零结尾的字符串,该字符串字符串将代码转换为to_codeset。

字符串rep_locale_to_utf8

功能:字符* 字符串rep_locale_to_utf8 (常量字符*字符串)

字符串:输入以零结尾的字符串。

通过以下方法将在区域设置的字符集中编码的字符串转换为UTF-8使用字符串rep_convert().

返回值:返回新分配的以零结尾的字符串,该字符串字符串转换为UTF-8。

字符串rep_utf8_to_locale

功能:字符* 字符串rep_utf8_to_scale (常量字符*字符串)

字符串:输入以零结尾的字符串。

将UTF-8编码的字符串转换为语言环境的字符集使用字符串rep_convert().

返回值:返回新分配的以零结尾的字符串,该字符串字符串转换成语言环境的字符集。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

4 Stringprep函数

Stringprep描述了一个用于在中准备Unicode文本字符串的框架以增加字符串输入和字符串的可能性比较工作的方式对整个过程中的典型用户都有意义世界。stringprep协议对协议标识符很有用价值观、公司和个人名称、国际化域名、,以及其他文本字符串。

4.1头文件字符串代表。小时

要使用本章中介绍的功能,您需要包括文件字符串代表。小时使用:

#包括<stringprep.h>

4.2定义Stringprep配置文件

为希望指定他们自己的stringprep配置文件。由于这些都相当模糊,由于与实施相关的必要性,我们不记录它们在这里。查看字符串代表。小时头文件,以及配置文件。c(c)详细信息的源代码。

4.3控制标记

Stringprep标志:字符串准备配置文件标记 字符串PREP_NO_NFKC

禁用NFKC规范化,并选择非NFKC案例折叠桌。配置文件通常指定BIDI和NFKC设置,除非在特殊情况下,否则应用程序不应覆盖它。

Stringprep标志:字符串准备配置文件标记 字符串PREP_NO_BIDI

禁用BIDI步骤。通常配置文件指定BIDI和NFKC设置,应用程序不应覆盖它,除非在特殊情况下情况。

Stringprep标志:字符串准备_文件标记 字符串PREP_NO_UNASSIGNED

如果字符串包含未分配的内容,则使库返回错误根据配置文件显示字符。

4.4核心功能

字符串rep_4i

功能:整数 字符串rep_4i (单位32_t*ucs公司4,大小_t*伦恩,大小_t最大4len,字符串prep_profile_flags旗帜,const字符串配置文件*轮廓)

ucs公司4:要准备字符串的输入/输出数组。

伦恩:on input,具有Unicode代码点的输入数组的长度,退出时,具有Unicode代码点的输出数组的长度。

最大4len:输入/输出数组的最大长度。

旗帜:a字符串准备配置文件标记值或0。

轮廓:指向的指针字符串准备_文件使用。

根据stringprep配置文件准备输入UCS-4字符串,并将结果写回输入字符串。

输入无需以零结束(ucs公司4[伦恩] = 0).输出不会以零结束,除非ucs公司4[伦恩] = 0.相反,请参见字符串rep_4zi()如果输入以零结尾或如果你想输出。

由于stringprep操作可以扩展字符串,最大长度4指示保存字符串的缓冲区的大小。此函数不会读取或写入超出该大小的代码点。

这个旗帜是其中之一字符串准备配置文件标记值或0。

这个轮廓包含字符串准备_配置文件指示执行。您的应用程序可能会定义新的配置文件重新使用始终是其一部分的通用stringprep表库,或使用当前支持的配置文件之一。

返回值:返回字符串准备_确定iff成功,或字符串prep_rc错误代码。根据stringprep配置文件准备输入UCS-4字符串,并将结果写回输入字符串。

输入无需以零结束(ucs公司4[伦恩] = 0).除非ucs公司4[伦恩] = 0.相反,请参见字符串rep_4zi()如果输入以零结尾或如果你想输出。

由于stringprep操作可以扩展字符串,最大4len指示保存字符串的缓冲区的大小。此函数不会读取或写入超出该大小的代码点。

这个旗帜是其中之一字符串准备配置文件标记值或0。

这个轮廓包含字符串准备_文件指示执行。您的应用程序可能会定义新的配置文件重新使用始终是其一部分的通用stringprep表库,或使用当前支持的配置文件之一。

返回值:返回字符串准备_确定iff成功,或字符串prep_rc错误代码。

字符串rep_4zi

功能:整数 字符串rep_4zi (单位32_t*ucs公司4,大小_t最大4len,字符串prep_profile_flags旗帜,const字符串配置文件*轮廓)

ucs公司4:要准备的字符串以零结尾的输入/输出数组。

最大4len:输入/输出数组的最大长度。

旗帜:a字符串准备_文件标记值或0。

轮廓:指向的指针字符串准备_配置文件使用。

根据stringprep配置文件,并将结果写回输入字符串。

由于stringprep操作可以扩展字符串,最大4len指示保存字符串的缓冲区的大小。此函数不会读取或写入超出该大小的代码点。

这个旗帜是其中之一字符串准备配置文件标记值或0。

这个轮廓包含字符串准备_文件指示执行。您的应用程序可能会定义新的配置文件重新使用始终是其一部分的通用stringprep表库,或使用当前支持的配置文件之一。

返回值:返回字符串准备_确定iff成功,或字符串prep_rc错误代码。

字符串代表

功能:整数 字符串代表 (字符*在里面,大小_t麦克斯伦,字符串prep_profile_flags旗帜,const字符串配置文件*轮廓)

在里面:要准备字符串的输入/输出数组。

麦克斯伦:输入/输出数组的最大长度。

旗帜:a字符串准备配置文件标记值或0。

轮廓:指向的指针字符串准备_配置文件使用。

根据stringprep配置文件,并将结果写回输入字符串。

请注意,必须转换在系统区域设置中输入的字符串在使用此函数之前,请参见字符串rep_locale_to_utf8().

由于stringprep操作可以扩展字符串,麦克斯伦指示保存字符串的缓冲区的大小。此函数不会读取或写入超出该大小的字符。

这个旗帜是其中之一字符串准备配置文件标记值或0。

这个轮廓包含字符串准备_配置文件指示执行。您的应用程序可能会定义新的配置文件重新使用始终是其一部分的通用stringprep表库,或使用当前支持的配置文件之一。

返回值:返回字符串准备_确定iff成功,或错误代码。

字符串rep_配置文件

功能:整数 字符串rep_配置文件 (常量字符*在里面,字符**外面的,常量字符*轮廓,字符串prep_profile_flags旗帜)

在里面:要准备UTF-8字符串的输入数组。

外面的:带有指向新分配字符串的指针的输出变量。

轮廓:要使用的stringprep配置文件的名称。

旗帜:a字符串准备配置文件标记值或0。

根据stringprep配置文件,并在新分配的变量。

请注意,必须转换在系统区域设置中输入的字符串在使用此函数之前,请参见字符串rep_locale_to_utf8().

输出外面的变量必须由调用方释放。

这个旗帜是其中之一字符串准备配置文件标记值或0。

这个轮廓指定要使用的stringprep配置文件的名称。它必须是内部支持的stringprep配置文件之一。

返回值:返回字符串准备_确定iff成功,或错误代码。

4.5错误处理

字符串rep_strerror

功能:常量字符* 字符串rep_strerror (字符串prep_rc钢筋混凝土)

钢筋混凝土:a字符串prep_rc返回代码。

将返回代码整数转换为文本字符串。此字符串可以是用于向用户输出诊断消息。

STRINGPREP_OK(字符串准备_确定):操作成功。此值保证为始终为零,其余的只能保证保持非零值,用于逻辑比较。

字符串PREP_CONTAINS_UNASSIGNED:字符串包含未分配的Unicode代码点,这是配置文件禁止的。

STRINGPREP_CONTAINS_PROBITED:字符串包含代码点被个人资料禁止。

字符串PREP_BIDI_BOTH_L_AND_RAL:字符串包含代码点冲突的双向类别。

字符串PREP_BIDI_LEADTRAIL_NOT_RAL:前导和尾随字符字符串中不属于正确的双向类别。

字符串PREP_BIDI_CONTAINS_PROHIBITED:包含禁止的代码通过双向代码检测到的点。

字符串rep_to_SMALL_BUFFER:移交给函数的缓冲区太大小。这通常表示调用中出现问题应用程序。

字符串预览_配置文件_错误:stringprep配置文件不一致。这通常表示库中存在内部错误。

字符串PREP_FLAG_ERROR:提供的标志与配置文件冲突。这通常表示调用应用程序中存在问题。

字符串rep_UNKNOWN_file:提供的配置文件名称不是为图书馆所知。

字符串PREP_ICONV_ERROR:字符编码转换错误。

字符串PREP_NFKC_FAILED:Unicode NFKC操作失败。这个通常表示库中存在内部错误。

字符串PREP_MALLOC_ERROR:这个malloc()内存不足。这是通常是致命的错误。

返回值:返回指向静态分配字符串的指针包含错误描述和返回代码钢筋混凝土.

4.6 Stringprep配置文件宏

功能:整数 字符串rep_nameprep_no_未分配 (字符*在里面,整数麦克斯伦)

在里面:要准备字符串的输入/输出数组。

麦克斯伦:输入/输出数组的最大长度。

根据nameprep配置文件准备输入UTF-8字符串。这个AllowUnassigned标志为false,请使用字符串rep_nameprep对于true AllowUnassigned(允许未分配)。如果成功,则返回0,或返回错误代码。

功能:整数 字符串rep_iscsi (字符*在里面,整数麦克斯伦)

在里面:要准备字符串的输入/输出数组。

麦克斯伦:输入/输出数组的最大长度。

根据iSCSI字符串报告草稿准备输入UTF-8字符串轮廓。如果成功,则返回0,或返回错误代码。

功能:整数 字符串rep_plain (字符*在里面,整数麦克斯伦)

在里面:要准备的带有字符串的输入/输出数组。

麦克斯伦:输入/输出数组的最大长度。

根据SASL ANONYMOUS草案准备输入UTF-8字符串个人资料。如果成功,则返回0,或返回错误代码。

功能:整数 字符串rep_xmpp_noderep (字符*在里面,整数麦克斯伦)

在里面:要准备字符串的输入/输出数组。

麦克斯伦:输入/输出数组的最大长度。

根据草稿XMPP节点准备输入UTF-8字符串标识符配置文件。如果成功,则返回0,或返回错误代码。

功能:整数 字符串rep_xmpp_resourceprep (字符*在里面,整数麦克斯伦)

在里面:要准备字符串的输入/输出数组。

麦克斯伦:输入/输出数组的最大长度。

根据XMPP资源草稿准备输入UTF-8字符串标识符配置文件。如果成功,则返回0,或返回错误代码。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

5 Punycode函数

Punycode是一种简单高效的传输编码语法用于应用程序中的国际化域名。唯一且可逆地将Unicode字符串转换为ASCII字符串。表示Unicode字符串中的ASCII字符字面上,和非ASCII字符由ASCII表示主机名标签中允许的字符(字母、数字和连字符)。名为Bootstring的通用算法允许字符串基本代码点,以唯一地表示任何代码点字符串从较大的集合中提取。Punycode是Bootstring的一个实例使用适用于IDNA的特定参数值。

5.1头文件puny代码。小时

要使用本章中介绍的功能,您需要包括文件puny代码。小时使用:

#包括<punycode.h>

5.2 Unicode码位数据类型

punycode函数使用特殊类型表示Unicode代码点。它保证始终是32位无符号整数。

Punycode Unicode码位:单位32_t punycode_uint

包含Unicode代码点的无符号整数。

5.3核心功能

请注意,如果input_length(输入_长度)超过4294967295(punycode_uint). 将来可能会取消此限制。同时,鼓励应用程序不依赖于此问题,和使用大小初始化input_length(输入_长度)输出_长度.

提供的功能有以下两个入口点:

punycode_encode码

功能:整数 punycode_encode码 (大小_tinput_length(输入_长度),常量punycode_uint[]输入,const无符号字符[]case_flags(案例标记),大小_t*输出_长度,字符[]输出)

input_length(输入_长度):中的代码点数量输入数组和中的标志数case_flags(案例标记)数组。

输入:代码点数组。它们被假定为Unicode代码点,但这不是严格要求的。阵列包含代码点,而不是代码单元。UTF-16使用代码单位D800到DFFF指代码点10000..10FFFF。这个代码点D800..DFFF不出现在任何有效的Unicode字符串中。可以出现在Unicode字符串(0..D7FF和E000..10FFFF)也称为Unicode标量值。

case_flags(案例标记):A无效的指针或并行布尔值数组输入数组。非零(true,标记)表示相应的Unicode字符在后面强制大写被解码(如果可能),零(假,无标记)表示强制小写(如果可能的话)。ASCII码点(0..7F)按字面编码,ASCII字母除外根据相应的case标志。如果case_flags(案例标记)是一个无效的指针然后是ASCII字母保持原样,其他代码点被视为无标记。

输出_长度:调用方传入的ASCII的最大数量它可以接收的代码点。成功返回后,它将包含实际输出的ASCII码点数。

输出:ASCII码点的数组。它是*不是*零终止;当且仅当输入包含零。(当然,来电者可以离开房间终止符并根据需要添加一个。)

转换代码点序列(假定为Unicode代码点)到Punycode。

返回值:返回值可以是Punycode_status公司上面定义的值,除了PUNYCODE_BAD_INPUT(输入).如果没有PUNYCODE_成功,然后输出_大小输出可能包含垃圾。转换代码点序列(假定为Unicode代码点)到Punycode。

返回值:返回值可以是Punycode_status公司上面定义的值,除了PUNYCODE_BAD_INPUT(输入).如果没有PUNYCODE_成功,然后输出_大小输出可能包含垃圾。

puny代码_代码

功能:整数 puny代码_代码 (大小_tinput_length(输入_长度),常量字符[]输入,大小_t*输出_长度,punycode_uint[]输出,无符号字符[]案例标志)

input_length(输入_长度):中ASCII码点数输入数组。

输入:ASCII码位数组(0..7F)。

输出_长度:调用者传入的代码数最多它可以接收到的点输出数组(它也是它可以接收到的最大标志数case_flags(案例标记)数组,如果case_flags(案例标记)不是无效的指针)。打开成功返回它将包含代码点的数量实际输出(这也是实际的标志数输出,如果case_flags不是空指针)。解码器将输出的代码点永远不需要超过ASCII的数量由于编码方式的原因,输入中的代码点定义。输出的代码点数不能超过punycodeuint的最大可能值,即使提供了输出_长度比这更重要。

输出:类似的输入参数的代码点数组punycode_encode()(见上文)。

案例标志:A无效的指针(如果调用方)或与输出数组。非零(true,标记)表示对应的调用方将Unicode字符强制为大写(如果可能),零(假,无标记)表示强制小写(如果可能)。输出ASCII码点(0..7F)已经在适当的情况下,但将设置其标志适当地应用标志是无害的。

将Punycode转换为代码点序列(假定为Unicode代码点)。

返回值:返回值可以是Punycode_status公司上面定义的值。如果没有PUNYCODE_成功,然后输出_长度,输出、和case_flags(案例标记)可能包含垃圾。

5.4错误处理

punycode_strerror错误

功能:常量字符* punycode_strerror错误 (Punycode_status公司钢筋混凝土)

钢筋混凝土:一个Punycode_status公司返回代码。

将返回代码整数转换为文本字符串。此字符串可以是用于向用户输出诊断消息。

PUNYCODE_成功:操作成功。该值得到保证要始终为零,其余的只能保证保持非零值,用于逻辑比较。

PUNYCODE_BAD_输入:输入无效。

PUNYCODE_BIG_输出:输出将超过所提供的空间。

PUNYCODE_溢流:输入需要更宽的整数来处理。

返回值:返回指向静态分配字符串的指针包含错误描述和返回代码钢筋混凝土.


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

6 IDNA功能

到目前为止,还没有标准的域名使用方法ASCII指令表之外的字符。IDNA文件定义国际化域名(IDN)和一种称为IDNA的机制以标准方式处理它们。IDN使用从大曲目(Unicode),但IDNA允许非ASCII字符仅使用中已允许的ASCII字符表示今天所谓的主机名。此向后兼容表示为在现有协议(如DNS)中需要,以便IDN可以在不改变现有基础设施的情况下引入。IDNA是仅用于处理域名,而非自由文本。

6.1头文件艾德纳。小时

要使用本章中介绍的功能,您需要包括文件艾德纳。小时使用:

#包括<idna.h>

6.2控制标记

IDNA公司旗帜参数可以采用以下值,或包括比特的或参数的任何子集的:

返回代码:标识_标志 IDNA_ALLOW_未签名

允许未分配的Unicode代码点。

返回代码:标识_标志 IDNA_USE_STD3_ASCII_RULES公司

检查输出以确保它是符合STD3的主机名。

6.3前缀字符串

宏:#定义 IDNA_ACE_PREFIX公司

带有官方IDNA前缀的字符串,x个--.

6.4核心功能

IDNA函数名背后的思想如下:身份证idna_to_unicode _44i函数是核心IDNA原语。这个4指示函数采用UCS-4字符串(即32位编码的Unicode码位无符号整数类型)。这个表明数据被“内联”写入缓冲区。这意味着调用者负责分配(和取消分配)字符串,并为库提供分配的字符串长度。输出长度写入输出长度变量。这个其余函数都包含z指示器,这意味着字符串以零结尾。所有输出字符串都由分配库,并且必须由调用方取消分配。这个4指示器再次表示字符串是UCS-48是指字符串为UTF-8指示器表示字符串是以当前区域设置使用的编码进行编码。

提供的功能是以下入口点:

idna_to_ascii_4i

功能:整数 idna_to_ascii_4i (常量uint32_t*在里面,大小_t进水口,字符*外面的,整数旗帜)

在里面:带有unicode代码点的输入数组。

进水口:具有unicode代码点的输入数组的长度。

外面的:输出以零结尾的字符串,该字符串在处必须有空间至少63个字符加上终止零。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

ToASCII操作采用一系列Unicode代码点组成一个域标签并将其转换为一系列代码ASCII范围内的点(0..7F)。如果ToASCII成功原始序列和结果序列是等价的标签。

值得注意的是,ToASCII操作可能会失败。ToASCII码如果任何步骤失败,则失败。如果ToASCII操作的任何步骤在域名的任何标签上都失败,该域名不得使用作为国际化域名。用这个消亡的方法失败是特定于应用程序的。

ToASCII的输入是一系列代码点,即AllowUnassigned标志和UseSTD3ASCIIRules标志。ToASCII的输出是ASCII码点序列或故障条件。

ToASCII从不改变ASCII中的代码点序列范围(尽管可能会失败)。应用ToASCII多次操作的效果与仅应用它的效果完全相同一次。

返回值:成功时返回0,或返回标识(_R)错误代码。

idna_to_unicode _44i

功能:整数 idna_to_unicode _44i (常数uint32_t*在里面,大小_t进水口,单位32_t*外面的,大小_t*1.adj.使出局(outlen的过去分词),整数旗帜)

在里面:带有unicode代码点的输入数组。

进水口:具有unicode代码点的输入数组的长度。

外面的:带有unicode代码点的输出数组。

1.adj.使出局(outlen的过去分词):输入时,带有unicode代码点的输出数组的最大大小,在退出时,带有unicode代码点的输出数组的实际大小。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

ToUnicode操作采用一系列Unicode代码点组成一个域标签并返回Unicode序列的代码点。如果输入序列是ACE形式的标签,则结果是一个不在ACE中的等效国际化标签否则原始序列将原封不动地返回。

ToUnicode从未失败。如果任何步骤失败,则原始输入在该步骤中立即返回序列。

Punycode解码器输出的代码点永远不会超过它输入,但Nameprep可以,因此ToUnicode可以。请注意表示代码点序列所需的八位字节数取决于使用的特定字符编码。

ToUnicode的输入是一系列代码点AllowUnassigned标志和UseSTD3ASCIIRules标志。的输出ToUnicode始终是一系列Unicode代码点。

返回值:返回标识(_R)错误条件,但只能是用于调试目的。输出缓冲区始终根据规范(sans-malloc引起的错误)。注意!这意味着通常忽略此函数的返回代码,如下所示检查它意味着打破标准。

6.5简化ToASCII接口

idna_to_ascii_4z

功能:整数 idna_to_ascii_4z (常数uint32_t*输入,字符**输出,整数旗帜)

输入:以零结尾的输入Unicode字符串。

输出:指向新分配的输出字符串的指针。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

将UCS-4域名转换为ASCII字符串。域名可以包含几个由点分隔的标签。输出缓冲区必须被调用者释放。

返回值:返回IDNA_成功成功或错误代码。

idna_to_ascii_8z

功能:整数 idna_to_ascii_8z (常量字符*输入,字符**输出,整数旗帜)

输入:以零结尾的输入UTF-8字符串。

输出:指向新分配的输出字符串的指针。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

将UTF-8域名转换为ASCII字符串。域名可以包含几个由点分隔的标签。输出缓冲区必须被调用者释放。

返回值:返回IDNA_成功成功或错误代码。

idna_to_ascii_lz

功能:整数 idna_to_ascii_lz (常量字符*输入,字符**输出,整数旗帜)

输入:在当前区域设置中编码的以零结尾的输入字符串字符集。

输出:指向新分配的输出字符串的指针。

旗帜:一个标识(_F)值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

将区域设置编码中的域名转换为ASCII字符串域名可能包含多个由点分隔的标签。这个调用方必须释放输出缓冲区。

返回值:返回IDNA_成功成功或错误代码。

6.6简化ToUnicode接口

idna_to_unicode 4z4z

功能:整数 idna_to_unicode 4z4z (常数uint32_t*输入,单位32_t**输出,整数旗帜)

输入:以零结尾的Unicode字符串。

输出:指向新分配的输出Unicode字符串的指针。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

将UCS-4格式的可能ACE编码域名转换为UCS-4字符串。域名可能包含多个标签,由点分隔。输出缓冲区必须由呼叫方。

返回值:返回IDNA_成功成功或错误代码。

idna_to_unicode 8z4z

功能:整数 idna_to_unicode 8z4z (常量字符*输入,单位32_t**输出,整数旗帜)

输入:以零结尾的UTF-8字符串。

输出:指向新分配的输出Unicode字符串的指针。

旗帜:一个标识_标志值,例如。,允许未签名IDNA_USE_STD3_ASCII_RULES公司.

将UTF-8格式的可能ACE编码域名转换为UCS-4字符串。域名可能包含多个标签,由点分隔。输出缓冲区必须由呼叫方。

返回值:返回IDNA_成功成功或错误代码。

idna_to_unicode 8z8z

功能:整数 idna_to_unicode 8z8z (常量字符*输入,字符**输出,整数旗帜)

输入:以零结尾的UTF-8字符串。

输出:指向新分配的输出UTF-8字符串的指针。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

将UTF-8格式的可能ACE编码域名转换为UTF-8字符串。域名可能包含多个标签,由点分隔。输出缓冲区必须由呼叫方。

返回值:返回IDNA_成功成功或错误代码。

idna_to_unicode_8zlz

功能:整数 idna_to_unicode 8zlz (常量字符*输入,字符**输出,整数旗帜)

输入:以零结尾的UTF-8字符串。

输出:指向编码在当前区域设置的字符集。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

将UTF-8格式的可能ACE编码域名转换为当前区域设置的字符集中编码的字符串。名称可能包含多个由点分隔的标签。输出调用方必须释放缓冲区。

返回值:返回IDNA_成功成功或错误代码。

idna_to_unicode _lzlz

功能:整数 idna_to_unicode _lzlz (常量字符*输入,字符**输出,整数旗帜)

输入:在当前区域设置中编码的以零结尾的字符串字符集。

输出:指向编码在当前区域设置的字符集。

旗帜:一个标识_标志值,例如。,IDNA_ALLOW_未签名IDNA_USE_STD3_ASCII_RULES公司.

转换区域设置字符中可能使用ACE编码的域名设置为用当前语言环境的字符集编码的字符串。域名可能包含多个由点分隔的标签。这个调用方必须释放输出缓冲区。

返回值:返回IDNA_成功成功或错误代码。

6.7错误处理

idna存储错误

功能:常量字符* idna_错误 (标识_ rc钢筋混凝土)

钢筋混凝土:一个标识(_R)返回代码。

将返回代码整数转换为文本字符串。此字符串可以是用于向用户输出诊断消息。

IDNA_成功:操作成功。此值保证为始终为零,其余的只能保证保持非零值,用于逻辑比较目的。

IDNA_STRINGPREP_ERROR:字符串准备期间出错。

IDNA_PUNYCODE_ERROR(标识代码_错误):punycode操作过程中出错。

IDNA_CONTAINS_NON_LDH:对于IDNA_USE_STD3_ASCII_RULES,请指出字符串包含非LDH ASCII字符。

IDNA_CONTAINS_MINUS:对于IDNA_USE_STD3_ASCII_RULES,请指出字符串包含前导或尾随连字符-分钟(U+002D)。

IDNA_INVALID_LENGTH:最终输出字符串不在(包括1到63个字符)。

IDNA_NO_ACE_PREFIX:字符串不包含ACE前缀(对于ToUnicode)。

IDNA_ROUNDTRIP_VERIFY_ERROR:输出上的ToASCII操作字符串不等于输入。

IDNA_CONTAINS_ACE_PREFIX:输入包含ACE前缀(用于ToASCII)。

IDNA_ICONV错误:字符编码转换错误。

IDNA_MALLOC_ERROR:无法分配缓冲区(这通常是致命错误)。

IDNA_DLOPEN_ERROR:无法dlopen libcidn DSO(仅使用libc内部)。

返回值:返回指向静态分配字符串的指针包含错误描述和返回代码钢筋混凝土.


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

7 TLD功能

管理一些顶级域(TLD)的组织已发布包含域中接受的字符的表。原因可能是是为了减少使用整个Unicode范围带来的复杂性,并保护自己免受未来(向后不兼容)变化的影响IDN或Unicode规范。Libidn实现用于根据此类表定义和检查字符串的基础结构。Libidn还提供了一些来自TLD的表,我们已经设法获得了这些表允许从中使用它们。因为这些桌子更少与Unicode或StringPrep表相比,它们很可能是静态的不时更新(即使是以向后不兼容的方式)。Libidn接口为每个TLD表提供一个“版本”字段,可以进行相等比较以保证相同的操作随着时间的推移。

从设计角度来看,可以将IDN的TLD表视为“国际化”之后的“本地化”步骤IETF标准提供的步骤。

TLD功能依赖于最新的表。最新版本Libidn的目标是提供这些,但复制不清楚的表格不包括条件或一般实验表。一些这些表可以在以下位置找到https://github.com/gnauthor/tldchk.

7.1头文件tld公司。小时

要使用本章中介绍的功能,您需要包括文件tld公司。小时使用:

#包括<tld.h>

7.2核心功能

tld检查4t

功能:整数 tld检查4t (常数uint32_t*在里面,大小_t入口,大小_t*错误(errpos),常量Tld_table*tld公司)

在里面:要处理的unicode代码数组。不需要以零结尾。

进水口:unicode代码点的数量。

错误(errpos):此处返回冒犯字符的位置。

热释光剂量:ATld_表表示限制的数据结构应该测试哪些输入。

测试中的每个代码点在里面无论是否它们是中的数据结构所允许的热释光剂量,返回第一个字符的位置,它不是案例错误(errpos).

返回值:返回Tld_rc公司价值TLD_成功如果所有代码积分有效或热释光剂量为空,TLD_无效如果是不允许使用字符,或常规上的其他错误代码故障条件。

tld检查4tz

功能:整数 tld检查4tz (常数uint32_t*在里面,大小_t*错误位置,常量Tld_table*热释光剂量)

在里面:要处理的以零结尾的unicode代码数组。

错误位置:此处返回冒犯字符的位置。

热释光剂量:ATld_表表示限制的数据结构应该测试哪些输入。

测试中的每个代码点在里面无论是否它们是中的数据结构所允许的热释光剂量,返回第一个字符的位置,它不是案例错误(errpos).

返回值:返回Tld_rc公司价值TLD_成功如果所有代码分数有效或热释光剂量为空,TLD_无效如果是不允许使用字符,或常规上的其他错误代码故障条件。

7.3公用功能

tld获取4

功能:整数 tld获取4 (常数uint32_t*在里面,大小_t进水口,字符**外面的)

在里面:要处理的unicode代码数组。不需要以零结尾。

进水口:unicode代码点的数量。

外面的:以零结尾的ascii结果字符串指针。

隔离的顶级域在里面并将其作为ASCII返回字符串输入外面的.

返回值:返回TLD_成功或相应的Tld_rc公司否则返回错误代码。

tld获取4z

功能:整数 tld获取4z (常数uint32_t*在里面,字符**外面的)

在里面:要处理的以零结尾的unicode代码数组。

外面的:以零结尾的ascii结果字符串指针。

隔离的顶级域在里面并将其作为ASCII返回字符串输入外面的.

返回值:返回TLD_成功或相应的Tld_rc公司否则返回错误代码。

tld获取z

功能:整数 tld获取z (常量字符*在里面,字符**外面的)

在里面:要处理以零结尾的字符数组。

外面的:以零结尾的ascii结果字符串指针。

隔离的顶级域在里面并将其作为ASCII返回字符串输入外面的.输入字符串在里面可以是UTF-8、ISO-8859-1或任何ASCII兼容字符编码。

返回值:返回TLD_成功或相应的Tld_rc公司否则返回错误代码。

tld_get_table(tld_get_table)

功能:常量Tld_table* tld获取表 (常量字符*热释光剂量,常量Tld_table**桌子)

热释光剂量:TLD名称(例如“com”)为以零结尾的ASCII字节字符串。

桌子:以零结尾的数组Tld_表信息结构TLD。

通过搜索给定的TLD表数组。

返回值:TLD对应的返回结构热释光剂量通过去通过桌子,或返回无效的如果没有发现这样的结构。通过搜索给定的TLD表数组。

返回值:TLD对应的返回结构热释光剂量通过去通过桌子,或返回无效的如果没有发现这样的结构。

tld默认表

功能:常量Tld_table* tld默认表 (常量字符*热释光剂量,常量Tld_table**覆盖)

热释光剂量:TLD名称(例如“com”)为以零结尾的ASCII字节字符串。

覆盖:的附加以零结尾的数组Tld_表TLD信息结构,或无效的仅使用库默认值桌子。

使用内部默认值获取命名TLD的TLD表,可能被(可选)提供的表覆盖。

返回值:TLD对应的返回结构tld字符串,第一仔细查看覆盖然后通过内置列表,或无效的如果找不到这样的结构。

7.4高级包装功能

tld检查4

功能:整数 tld检查4 (常数uint32_t*在里面,大小_t进水口,大小_t*错误(errpos),常量Tld_table**覆盖)

在里面:要处理的unicode代码数组。不需要以零结尾。

进水口:unicode代码点的数量。

错误(errpos):此处返回冒犯字符的位置。

覆盖:ATld_表附加域限制数组补充和取代内置信息的结构。

测试中的每个代码点在里面不管他们是不是中的信息允许覆盖或通过内置TLD限制数据。当同一TLD的数据可用时内部和内部覆盖,中的信息覆盖取得优先。如果找到特定TLD的多个条目使用第一个。如果覆盖无效的,仅内置使用信息。第一个冒犯字符的位置在中返回错误(errpos).

返回值:返回Tld_rc公司价值TLD_成功如果所有代码分数有效或热释光剂量为空,TLD_无效如果是不允许使用字符,或常规上的其他错误代码故障条件。

tld检查4z

功能:整数 tld检查4z (常数uint32_t*在里面,大小_t*错误(errpos),常量Tld_table**覆盖)

在里面:以零结尾的unicode代码数组指向进程。

错误(errpos):此处返回冒犯字符的位置。

覆盖:ATld_表附加域限制数组补充和取代内置信息的结构。

测试中的每个代码点在里面不管他们是不是中的信息允许覆盖或通过内置TLD限制数据。当同一TLD的数据可用时内部和内部覆盖,中的信息覆盖取得优先。如果找到特定TLD的多个条目使用第一个。如果覆盖无效的,仅内置使用信息。第一个冒犯字符的位置在中返回错误(errpos).

返回值:返回Tld_rc公司价值TLD_成功如果所有代码分数有效或热释光剂量为空,TLD_无效如果是不允许使用字符,或常规上的其他错误代码故障条件。

tld检查8z

功能:整数 tld检查8z (常量字符*在里面,大小_t*错误(errpos),常量Tld_table**覆盖)

在里面:要处理的以零结尾的UTF8字符串。

错误(errpos):此处返回冒犯字符的位置。

覆盖:ATld_表附加域限制数组补充和取代内置信息的结构。

测试中的每个字符在里面无论他们是否中的信息允许覆盖或通过内置TLD限制数据。当同一TLD的数据可用时内部和内部覆盖,中的信息覆盖取得优先。如果找到特定TLD的多个条目使用第一个。如果覆盖无效的,仅内置使用信息。第一个冒犯字符的位置在中返回错误(errpos)。请注意,错误位置是指解码的字符偏移量,而不是字符串。

返回值:返回Tld_rc公司价值TLD_成功如果有的话字符有效或热释光剂量为空,TLD_无效如果是不允许使用字符,或常规上的其他错误代码故障条件。

tld检查_lz

功能:整数 tld检查_lz (常量字符*在里面,大小_t*错误(errpos),常量Tld_table**覆盖)

在里面:要处理的当前区域设置编码中以零结尾的字符串。

错误(errpos):此处返回冒犯字符的位置。

覆盖:ATld_表附加域限制数组补充和取代内置信息的结构。

测试中的每个字符在里面不管他们是不是中的信息允许覆盖或通过内置TLD限制数据。当同一TLD的数据可用时内部和内部覆盖,中的信息覆盖取得优先。如果找到特定TLD的多个条目使用第一个。如果覆盖无效的,仅内置使用信息。第一个冒犯字符的位置在中返回错误(errpos)请注意,错误位置指的是解码字符偏移量,而不是字符串。

返回值:返回Tld_rc公司价值TLD_成功如果有的话字符有效或热释光剂量为空,TLD_无效如果是不允许使用字符,或常规上的其他错误代码故障条件。

7.5错误处理

tldstrerror错误

功能:常量字符* tldstrerror错误 (Tld_rc)钢筋混凝土)

钢筋混凝土:tld返回代码

将返回代码整数转换为文本字符串。此字符串可以是用于向用户输出诊断消息。

TLD_成功:操作成功。此值保证为始终为零,剩下的只能保证保持非零值,用于逻辑比较。

TLD_无效:发现无效字符。

TLD_NODATA:未提供任何输入数据。

TLD_MALLOC_错误:内存分配期间出错。

TLD_ICONV_错误:字符编码转换错误。

TLD_NO_TLD:在域字符串中找不到顶级域。

返回值:返回指向静态分配字符串的指针包含错误描述和返回代码钢筋混凝土.


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

8 PR29功能

Unicode规范化表单规范中的一个缺陷是已找到。结果是一些字符串可以被规范化由不同的实现转换成不同的字符串。换句话说,两个不同的实现可能会为同一个返回不同的输出输入(因为规范的解释是模棱两可)。此外,在输出字符串可能返回不同的字符串(因为对模棱两可的规范进行规范化解释非幂等的)。幸运的是,只有少数几个字符序列表现出这个问题,并且这些问题都不会发生在自然语言(由于涉及的语言使用不同字符)。

有关该问题的详细讨论,请参阅:

http://www.unicode.org/review/pr-29.html

以下PR29功能可用于检测问题序列。所以你想什么时候使用这些功能?对于大多数应用程序,例如那些使用Nameprep for IDN的用户,这可能只是一个互操作性问题。因此,您可能不想关心它,因为字符序列很少会自然出现。然而,如果您正在使用配置文件(如SASLPrep)来处理身份验证代币;授权令牌;或密码,存在真正的危险攻击者可能会尝试使用这些字符串中的特性来攻击系统的某些部分。作为少数字符串,以及没有自然出现的字符串,表现出这个问题,保守建议采用拒绝字符串的方法。如果这种方法是如果没有使用,则应验证系统的所有部分,处理令牌和密码的NFKC实现对于相同的输入产生相同的输出。

有技术倾向的读者可能有兴趣了解更多PR29缺陷的实现方面。请参见PR29讨论.

8.1头文件第29页

要使用本章中介绍的功能,您需要包括文件第29页使用:

#包括<pr29.h>

8.2核心功能

pr294型

功能:整数 pr294型 (常数uint32_t*在里面,大小_t伦恩)

在里面:带有unicode代码点的输入数组。

伦恩:具有unicode代码点的输入数组的长度。

检查输入,看看是否可以将其归一化为不同的由于NFKC规范。

返回值:返回项目29(_R)价值PR29_成功成功,PR29_问题如果输入序列是“问题序列”(即,可以通过不同的实现)。

8.3公用功能

pr29_4赫兹

功能:整数 第29页第4小节 (常数uint32_t*在里面)

在里面:以零结尾的Unicode代码点数组。

检查输入,看看是否可以将其归一化为不同的由于NFKC规范。

返回值:返回项目29(_R)价值PR29_成功成功,PR29_问题如果输入序列是“问题序列”(即,可以通过不同的实现)。

pr29_8z码

功能:整数 pr29_8z码 (常量字符*在里面)

在里面:以零结尾的输入UTF-8字符串。

检查输入,看看是否可以将其归一化为不同的由于NFKC规范。

返回值:返回项目29(_R)价值PR29_成功成功,PR29_问题如果输入序列是“问题序列”(即,可以通过不同的实现),或者PR29_触发PREP_ERROR如果有将字符串从UTF-8转换为UCS-4时出现问题。

8.4错误处理

pr29_错误

功能:常量字符* pr29_错误 (Pr29_rc)钢筋混凝土)

钢筋混凝土:一个项目29(_R)返回代码。

将返回代码整数转换为文本字符串。此字符串可以是用于向用户输出诊断消息。

PR29_成功:操作成功。该值保证为始终为零,其余的只能保证保持非零值,用于逻辑比较。

PR29_问题:遇到问题序列。

PR29_STRINGPREP_ERROR:字符集转换失败(仅对于pr29_8z()).

返回值:返回指向静态分配字符串的指针包含错误描述和返回代码钢筋混凝土.


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

9示例

本章包含示例代码,说明“Libidn”如何在编写自己的应用程序时使用。


下一步:,向上:示例  [目录][索引]

9.1示例1

此示例演示如何使用stringprep函数。

#包括<stdio.h>#包括<stdlib.h>#包括<string.h>#include<locale.h>/*setlocale()*/#包括<stringprep.h>/**建议使用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;整数rc;大小_ i;setlocale(LC_ALL,“”);printf(“输入字符串编码为“%s”:”,stringprep_locale_charset());fflush(标准输出);if(!fgets(buf,BUFSIZ,stdin))perror(“fgets”);buf[strlen(buf)-1]='\0';printf(“在locale2utf8(长度%ld)之前:”,(long int)strlen(buf));对于(i=0;i<strlen(buf));i++)printf(“%02x”,(无符号)buf[i]&0xFF);printf(“\n”);p=字符串rep_locale_to_utf8(buf);如果(p){strcpy(buf,p);自由(p);}其他的printf(“无法将字符串转换为UTF-8,仍在继续…\n”);printf(“Before stringprep(length%ld):”,(long int)strlen(buf));对于(i=0;i<strlen(buf));i++)printf(“%02x”,(无符号)buf[i]&0xFF);printf(“\n”);rc=stringprep(buf,BUFSIZ,0,stringprep_nameprep);if(rc!=字符串PREP_OK)printf(“Stringprep失败(%d):%s\n”,rc,Stringprep_strerror(rc));其他的{printf(“字符串rep之后(长度%ld):”,(long int)strlen(buf));对于(i=0;i<strlen(buf));i++)printf(“%02x”,(无符号)buf[i]&0xFF);printf(“\n”);}返回0;}

下一步:,上一个:,向上:示例  [目录][索引]

9.2示例2

这个例子演示了如何使用punycode函数。

#include<locale.h>/*setlocale()*//**此文件源自Adam M.Costello编写的RFC 3492。**免责声明和许可:关于整个文件或任何*部分(包括伪代码和C代码),作者*不作任何保证,也不对由此造成的任何损坏负责*从它的使用。作者授予任何人不可撤销的许可*以任何不减少的方式使用、修改和分发*任何其他人使用、修改和分发它的权利,*前提是重新分配的衍生作品不包含*误导作者或版本信息。衍生作品需求*不得根据类似条款获得许可。**/#包括<assert.h>#包括<stdio.h>#包括<stdlib.h>#包括<string.h>#包括<punycode.h>/*对于测试,我们只需设置一些编译时间限制,而不是*//*使用malloc(),并设置编译时间选项,而不是使用*//*命令行选项*/枚举{unicode最大长度=256,ace_max_length=256};静态空隙用法(char**argv){fprintf(标准错误,“\n”“%s-e读取代码点并写入Punycode字符串。\n”“%s-d读取Punycode字符串并写入代码点。\n”“\n”“输入和输出是本机字符集中的纯文本。\n”“代码点的格式为u+十六进制,由空格分隔。\n”“尽管规范允许Punycode字符串包含\n”ASCII指令表中的任何字符,此测试代码只支持可打印字符,并且需要Punycode“字符串后跟换行符。\n”“u+十六进制中u的大小写是强制大写标志。\n”,argv[0],argv[0);退出(exit_FAILURE);}静态空隙失败(const char*msg){fputs(消息,标准错误);退出(exit_FAILURE);}静态常量字符too_big[]=“输入或输出太大,请使用更大的限制重新编译\n”;static const char invalid_input[]=“无效输入\n”;静态常量字符溢出[]=“算术溢出\n”;static const char io_error[]=“I/O错误\n”;/*以下字符串用于转换可打印*//*ASCII和本机字符集之间的字符:*/static const char print_ascii[]=“\n\n\n\n\n\n \n\n\n \n\n \n\n\n\n”“\n\n\n \n \n\n\n \n\n”“!\”#$%&'()*+,-/" "0123456789:;<=>?“”\0x40“/*在标志处*/“ABCDEFGHIJKLMNO”“PQRSTUVWXYZ[\\]^_”“`abcdefghijklmno”“PQRSTUVWXYZ{|}~\n”;整数main(int argc,char**argv){枚举punycode_status状态;整数r;size_t输入长度,输出长度,j;无符号字符case_flags[unicode最大长度];setlocale(LC_ALL,“”);如果(argc!=2)用法(argv);if(argv[1][0]!=“-”)用法(argv);如果(argv[1][2]!=0)用法(argv);如果(argv[1]==“e”){uint32_t输入[unicode最大长度];无符号长codept;字符输出[ace_max_length+1],uplus[3];整数c;/*读取输入代码点:*/input_length=0;用于(;;){r=扫描(“%2s%lx”,uplus,&codept);if(费罗(标准输入))失败(io_error);如果(r==EOF||r==0)断裂;如果(r!=2|uplus[1]!='+'|codept>(uint32_t)-1){失败(invalid_input);}if(input_length==unicode最大长度)失败(too_big);if(uplus[0]=='u')case_flags[input_length]=0;else if(uplus[0]==“U”)case_flags[input_length]=1;其他的失败(invalid_input);input[input_length++]=代码点;}/*编码:*/output_length=ace_max_length;状态=punycode_encode(input_length,input,case_flags,&output_length,输出);如果(状态==punycode_bad_input)失败(invalid_input);if(状态==punycode_big_output)失败(too_big);if(状态==punycode_overflow)失败(溢出);断言(状态==punycode_success);/*转换为本机字符集并输出:*/对于(j=0;j<输出长度;++j){c=输出[j];断言(c>=0&&c<=127);if(print_asci[c]==0)失败(invalid_input);输出[j]=打印_科学[c];}输出[j]=0;r=投入(输出);如果(r==EOF)失败(io_error);返回EXIT_SUCCESS;}如果(argv[1]==“d”){字符输入[ace_max_length+2],*p,*pp;uint32_t输出[unicode最大长度];/*读取Punycode输入字符串并转换为ASCII:*/if(!fgets(输入,ace_max_length+2,stdin))失败(io_error);if(费罗(标准输入))失败(io_error);if(feof(stdin))失败(invalid_input);input_length=字符串(输入)-1;if(输入[input_length]!=“\n”)失败(too_big);输入[input_length]=0;for(p=输入;*p!=0;++p){pp=字符串(print_ascii,*p);如果(pp==0)失败(invalid_input);*p=pp-打印_科学;}/*解码:*/output_length=unicode最大长度;状态=punycode_decode(输入长度、输入和输出长度,输出,case_flags);if(状态==punycode_bad_input)失败(invalid_input);if(状态==punycode_big_output)失败(too_big);if(状态==punycode_overflow)失败(溢出);断言(状态==punycode_success);/*输出结果:*/对于(j=0;j<输出长度;++j){r=打印f(“%s+%04lX\n”,case_flags[j]?“U”:“U”,(无符号长)输出[j]);如果(r<0)失败(io_error);}返回EXIT_SUCCESS;}用法(argv);返回EXIT_SUCCESS;/*未到达,但使编译器警告安静*/}

下一步:,上一个:,向上:示例  [目录][索引]

9.3示例3

此示例演示了如何使用库进行转换将国际化域名转换为ASCII兼容名称。

#包括<stdio.h>#包括<stdlib.h>#包括<string.h>#include<locale.h>/*setlocale()*/#include<stringprep.h>/*stringprep_locale_charset()*/#include<idna.h>/*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ª示例*读取字符串(长度23):77 77 77 2e 72 e4 6b 73 6d f6 72 67 e5 73 aa 2e 65 78 61 d 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;整数rc;大小_ i;setlocale(LC_ALL,“”);printf(“输入域编码为“%s”:”,stringprep_locale_charset());fflush(标准输出);if(!fgets(buf,BUFSIZ,stdin))perror(“fgets”);buf[strlen(buf)-1]=“\0”;printf(“读取字符串(长度%ld):”,(long int)strlen(buf));对于(i=0;i<strlen(buf));i++)printf(“%02x”,(无符号)buf[i]&0xFF);printf(“\n”);rc=idna_to_ascii_lz(buf,&p,0);如果(rc!=IDNA_SUCCESS){printf(“ToASCII()失败(%d):%s\n”,rc,idna_strerror(rc));返回EXIT_FAILURE;}printf(“ACE标签(长度%ld):'%s'\n”,(long int)strlen(p),p);对于(i=0;i<strlen(p);i++)printf(“%02x”,(无符号)p[i]&0xFF);printf(“\n”);自由(p);返回0;}

下一步:,上一个:,向上:示例  [目录][索引]

9.4示例4

此示例演示了如何使用库转换ASCII与国际化域名兼容的名称。

#包括<stdio.h>#包括<stdlib.h>#包括<string.h>#include<locale.h>/*setlocale()*/#include<stringprep.h>/*stringprep_locale_charset()*/#include<idna.h>/*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 77 2e 78 6e 2d 72 6b 73 6d 72 67 73 61 2d 30 7a 61 70 38 70 2e 65 78 61 d 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;整数rc;大小_ i;setlocale(LC_ALL,“”);printf(“输入域编码为“%s”:”,stringprep_locale_charset());fflush(标准输出);if(!fgets(buf,BUFSIZ,stdin))perror(“fgets”);buf[strlen(buf)-1]=“\0”;printf(“读取字符串(长度%ld):”,(long int)strlen(buf));对于(i=0;i<strlen(buf));i++)printf(“%02x”,(无符号)buf[i]&0xFF);printf(“\n”);rc=idna_to_unicode _ lzlz(buf,&p,0);如果(rc!=IDNA_SUCCESS){printf(“ToUnicode()失败(%d):%s\n”,rc,idna_strerror(rc));返回EXIT_FAILURE;}printf(“ACE标签(长度%ld):'%s'\n”,(long-int)strlen(p),p);对于(i=0;i<strlen(p);i++)printf(“%02x”,(无符号)p[i]&0xFF);printf(“\n”);自由(p);返回0;}

上一页:,向上:示例  [目录][索引]

9.5示例5

此示例演示了如何使用库检查字符串特定TLD中的无效字符。

#包括<stdio.h>#包括<stdlib.h>#包括<string.h>/*获取stringprep_locale_charset等*/#包括<stringprep.h>/*获取idna_to_ascii_8z等*/#包括<idna.h>/*获取tld_check_4z*/#包括<tld.h>/**建议使用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;整数rc;size_t错误位置,i;printf(“输入域编码为“%s”:”,stringprep_locale_charset());fflush(标准输出);if(!fgets(buf,BUFSIZ,stdin))perror(“fgets”);buf[strlen(buf)-1]=“\0”;printf(“读取字符串(长度%ld):”,(long int)strlen(buf));对于(i=0;i<strlen(buf));i++)printf(“%02x”,(无符号)buf[i]&0xFF);printf(“\n”);p=字符串rep_locale_to_utf8(buf);如果(p){strcpy(buf,p);自由(p);}其他的printf(“无法将字符串转换为UTF-8,仍在继续…\n”);rc=idna_to_ascii8z(buf,&p,0);如果(rc!=IDNA_SUCCESS){printf(“idna_to_ascii_8z失败(%d):%s\n”,rc,idna_strerror(rc));返回2;}printf(“ToASCII字符串(长度%ld):%s\n”,(long int)strlen(p),p);rc=idna_to_unicode 8z4z(p,&r,0);自由(p);如果(rc!=IDNA_SUCCESS){printf(“idna_to_unicode_8z4z失败(%d):%s\n”,rc,idna_strerror(rc));返回2;}printf(“ToUnicode字符串:”);对于(i=0;r[i];i++)打印f(“U+%04x”,r[i]);printf(“\n”);rc=tld_check_4z(r,&errpos,NULL);自由(r);如果(rc==TLD_INVALID){printf(“域被TLD检查拒绝,Unicode位置%ld\n”,(long int)错误位置);返回1;}否则,如果(rc!=TLD_SUCCESS){printf(“tld_check_4z()失败(%d):%s\n”,rc,tld_sterror(rc));返回2;}printf(“TLD检查接受的域”);返回0;}

下一步:,上一个:,向上:GNU图书馆  [目录][索引]

10调用idn

10.1名称

GNU Libidn(idn)–国际化域名命令行工具

10.2说明

国际数字网络允许国际化字符串准备(‘字符串代表'),punycode数据的编码和解码,以及IDNA要在命令行上执行的ToASCII/ToUnicode操作。

如果在命令行上指定了字符串,则将其用作输入并将计算的输出打印为标准输出标准输出.如果命令行上没有指定字符串,程序将读取来自标准输入的逐行数据标准输入,并打印计算输出到标准输出。执行什么处理(例如,ToASCII或Punycode编码)由选项指示。如果有遇到错误时,应用程序的执行被中止。

所有字符串都应使用首选字符集进行编码根据您的地区。使用--调试找出这个字符集是什么。您可以通过设置环境变量覆盖使用的字符集CHARSET(查尔斯特).

处理以开头的字符串-例如-foo公司,使用--表示参数结束,如idn-安静-a---foo.

10.3选项

国际数字网络识别以下命令:

-h、 --help打印帮助并退出-五、 --版本打印版本并退出-s、 --stringprep根据nameprep配置文件准备字符串-d、 --punycode-decode解码punycode-e、 --punycode-encode编码punycode-a、 --idna-to-ascii根据idna转换为ACE(默认模式)-u、 --根据idna从ACE进行idna-to-unicode转换--allow-unassigned Toggle IDNA AllowUnassigned标志(默认为禁用)--usestd3asciirules切换IDNA usestd3asciirules标志(默认为关闭)--no-tld不检查tld特定规则的字符串-n、 --nfkc根据Unicode v3.2 nfkc规范化字符串-p、 --profile=STRING使用指定的stringprep配置文件--debug打印调试信息--安静无声操作

10.4环境变量

这个CHARSET(查尔斯特)环境变量可用于覆盖用于解码传入数据的字符集(即,在命令行或标准输入流上),并将数据编码为标准输出。但是,如果系统设置正确应用程序将猜测自动使用的字符集。示例用法:

$CHARSET=ISO-8859-1 idn--punycode-encode...

10.5示例

标准用法,从标准输入读取输入。参数--安静禁用打印版权、许可证和使用说明。

茉莉@拿铁:~$idn--安静räksmörgás.se公司xn-rksmrgs-5wao1o.se茉莉@拿铁:~$

从命令行读取输入:

茉莉@拿铁:~$idn--安静的räksmörgás.se blábrgröd.noxn-rksmrgs-5wao1o.sexn--blbrgrd-fxak7p.编号茉莉@拿铁:~$

直接访问特定的StringPrep配置文件:

茉莉@拿铁:~$idn--quiet--profile=SASLprep--stringprep teßtªteßta公司茉莉@拿铁:~$

10.6故障排除

正确编码字符数据,并确保Libidn使用相同的编码可能很困难。原因是系统以多个字符编码对字符数据进行编码,即,使用UTF-8型与一起ISO-8859-1标准ISO-2022-JP标准。此问题可能会继续存在,直到只有一个字符编码是进化的赢家,或者(更有可能,至少在某种程度上)永远。

解决字符编码问题的第一步Libidn将使用“--调试'参数以确定字符集编码'国际数字网络“相信你的语言环境。

茉莉@拿铁:~$idn--debug--quiet“”系统区域设置使用字符集“UTF-8”。茉莉@拿铁:~$

如果打印出来ANSI_X3.4-1968标准(即。,美国-亚洲科学院),这个表示您没有正确配置区域设置。要配置例如,您可以使用“LANG=sv_SE.UTF-8;出口'在/垃圾桶/桶提示,设置瑞典语的区域设置环境使用UTF-8型作为编码。

有时国际数字网络'似乎无法从您的系统转换将语言环境设置为UTF-8型(在内部使用),您将获得错误如下:

茉莉@拿铁:~$idn--安静的fooidn:无法从ISO-8859-1转换为UTF-8。茉莉@拿铁:~$

最简单的解释是您还没有安装图标(iconv)'转换工具。你可以找到它作为一个独立的GNU Libiconv中的库(https://www.gnu.org/software/libiconv/). 在许多GNU/Linux上系统,此库是系统的一部分,但您可能必须安装其他软件包(例如glibc刻度'代表Debian)至能够使用它。

另一种解释是错误是正确的,您正在喂食国际数字网络'无效数据。如果你没有小心使用字符集编码。例如,如果您的外壳下料ISO-8859-1标准环境,然后调用国际数字网络'使用'CHARSET(查尔斯特)'环境变量如下,你会喂它的ISO-8859-1标准性格,但强迫它相信他们是UTF-8型。这自然会导致错误,除非字节序列碰巧有效UTF-8型注意,即使如果没有错误,在这种情况下输出可能不正确,因为ISO-8859-1标准UTF-8型通常不编码与相同字节序列相同的字符。

jas@拿铁:~$idn--quiet--debug“”系统区域设置使用字符集“ISO-8859-1”。茉莉@拿铁:~$CHARSET=UTF-8 idn--安静--调试räksmörgås系统区域设置使用字符集“UTF-8”。输入[0]=U+0072输入[1]=U+4af3输入[2]=U+006d输入[3]=U+1b29e5输入[4]=U+0073输出[0]=U+0078输出[1]=U+006e输出[2]=U+002d输出[3]=U+002d输出[4]=U+0072输出[5]=U+006d输出[6]=U+0073输出[7]=U+002d输出[8]=U+0068输出[9]=U+0069输出[10]=U+0036输出[11]=U+0064输出[12]=U+0035输出[13]=U+0039输出[14]=U+0037输出[15]=U+0035输出[16]=U+0035输出[17]=U+0032输出[18]=U+0061xn--rms-hi6d597552a茉莉@拿铁:~$

这里的道德感是忘记“CHARSET(查尔斯特)'(配置您的locales)除非您知道自己在做什么,并且如果如果您想使用它,请在使用进行验证后小心操作--调试“你会得到想要的结果。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

11 Emacs API

Libidn中包括双关语.el伊德纳埃勒那个为Libidn API(有限的一组)提供了Emacs Lisp API。这个第节介绍了API。目前,IDNA API始终设置使用STD3ASCII规则标记并清除允许未分配标志,将来可能会有指定这些标志的功能通过API。

11.1 Punycode Emacs API

变量:puny代码程序

GNU库的名称国际数字网络应用程序。默认值为国际数字网络’. 可以自定义此变量。

变量:微码环境

添加到之前的环境变量定义列表过程环境’. 默认值为“(“字符集=UTF-8”)’.此变量可以自定义。

变量:punycode-encode参数

传递给的参数列表puny代码程序调用punycode编码模式。默认值为“(“--quiet”“--punycode-encode”)’.可以自定义此变量。

变量:微码解码参数

传递给的参数punycode程序调用punycode解码模式。默认值为“(“--quiet”“--punycode解码”)’.可以自定义此变量。

功能:punycode编码 一串

返回的Punycode编码一串,转换后输入UTF-8。

功能:punycode-decode码 一串

返回可能是多字节字符串的解码一串这是一个punycode编码的字符串。

11.2 IDNA Emacs API

变量:idna程序

GNU库的名称国际数字网络应用程序。默认值为国际数字网络’. 可以自定义此变量。

变量:idna环境

添加到之前的环境变量定义列表过程环境’. 默认值为“(“字符集=UTF-8”)’.可以自定义此变量。

变量:idna到ascii参数

传递给的参数列表idna程序调用IDNA ToASCII模式。默认值为“(“--quiet”“--idna-to-ascii”“--使用标准3科学规则”)’. 可以自定义此变量。

变量:idna到unicode参数

传递的参数idna程序调用IDNA ToUnicode模式。默认值为'(“--quiet”“--idna-to-unicode”“--使用标准3科学规则”)’. 可以自定义此变量。

功能:idna至ascii 一串

返回由计算的字符串的ASCII兼容编码(ACE)输入上的IDNA ToASCII操作一串,转换后UTF-8的输入。

功能:idna到unicode 一串

返回可能是IDNA输出的多字节字符串对输入计算的ToUnicode操作一串.


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

12 Java API

Libidn已经移植到Java编程语言结果,大多数API都可用于本机Java应用程序。本节包含有关此支持的注释,完整的文档是悬而未决的。

Java库(如果Libidn是使用Java支持构建的)(请参见下载和安装),将放置在java/libidn-1.42.jar。源代码如下java语言/在Maven目录布局中,有一个Mavenpom.xml(pom.xml)构建脚本。源代码文件位于java/src/main/java/gnu/inet/encoding/.

12.1概述

这个包提供了国际化应用程序中的域名(IDNA)标准。它完全是写的在Java中,不需要设置任何其他库。

gnu.inet.encode。IDNA类提供两个公共函数,toASCII和toUnicode,可按如下方式使用:

gnu.inet.encoding。IDNA.toASCII(“blöds.züg”);gnu.inet编码。IDNA.toUnicode(“xn--blds-6qa.xn--zg-xka”);

12.2其他程序

这个java/src/util/java/目录包含几个程序与GNU Libidn的Java部分相关,但这不需要包含在主源代码树或JAR文件中。

12.2.1生成RFC3454

该程序解析RFC3454并创建RFC3454.java程序在StringPrep阶段需要。

RFC可以在不同的位置找到,例如在http://www.ietf.org/rfc/rfc3454.txt.

按如下方式调用程序:

$java生成RFC3454正在创建RFC3454.java。。。好 啊。

12.2.2生成NFKC

GenerateNFKC程序解析Unicode字符数据库文件并生成NFKC所需的所有表。此程序需要版本的两个文件UnicodeData.txt和CompositionExclusions.txtUnicode文件的3.2。请注意,RFC3454(Stringprep)定义了将使用Unicode 3.2版,而不是最新版本。

Unicode数据文件可以在http://www.unicode.org/Public网站/.

按如下方式调用程序:

$java生成NFKC正在创建CombingClass.java。。。好的。正在创建DecompositionKeys.java。。。好 啊。正在创建分解映射.java。。。好 啊。正在创建Composition.java。。。好 啊。

12.2.3试验IDNA

TestIDNA程序允许手动测试IDNA实现或针对Simon Josefsson的测试向量。

测试向量可以在Libidn主页上找到,https://www.gnu.org/software/libidn/.

要手动测试转换,请使用:

$java-cp.:/usr/share/java/libidn.jar TestIDNA-a<string to test>输入:<要测试的字符串>输出:<toASCII(要测试的字符串)>$java-cp.:/usr/share/java/libidn.jar TestIDNA-u要测试的字符串>输入:<要测试的字符串>输出:<toUnicode(要测试的字符串)>

要针对draft-josefsson-idn-test-vectors.html进行测试,请使用:

$java-cp.:/usr/share/java/libidn/libidn.jar TestIDNA-t未检测到错误!

12.2.4测试NFKC

TestNFKC程序允许手动测试NFKC实现或针对Unicode数据文件中的NormalizationTest.txt文件。

要手动测试规范化,请使用:

$java-cp.:/usr/share/java/libidn.jar TestNFKC<string to test>输入:<要测试的字符串>输出:<nfkc要测试的字符串版本>

要根据NormalizationTest.txt进行测试:

$java-cp.:/usr/share/java/libidn.jar测试NFKC未检测到错误!

12.3可能出现的问题

当心错误:这个Java API需要更多的测试,尤其是具有“异国情调”的人物组合。虽然它对我有效,但可能不起作用为你。

Java源代码的编码:如果使用的是非ASCII字符在Java源代码中,确保javac用正确的编码。如有必要,请使用-编码参数。

Java Unicode处理:Java 1.4仅处理16位Unicode代码点(即基本多语言平面中的字符),这因此,实现忽略了对所谓补充字符(U+10000到U+10FFFF)。从Java开始1.5,Java也支持这些字符,但这将需要对此库进行更改。另请参阅下一节。

12.4 Java和Unicode注释

这个库使用Java内置的“char”数据类型。直到Java 1.4,这数据类型仅支持16位Unicode代码点,也称为基本多语言平面。由于这个原因,这个库不工作用于补充字符(即从U+10000到U+10FFFF)。对此类字符的所有引用都被默认忽略。

从Java 1.5开始,补充字符也将是支持。然而,这需要对当前版本进行更改图书馆的。Java 1.5目前处于测试状态。

有关更多信息,请参阅java.lang.Character的文档在JDK API中。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

13 C#API

Libidn库已经移植到C#语言。港口位于顶层csharp(csharp)/目录。目前没有有关实现或API的进一步文档如下可用。然而,C#端口是基于Java端口的API与Java版本中的完全相同。的帮助文件因此,Java API可能很有用。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

14确认

punycode实现取自IETF IDN Punyccode规范,由Adam M.Costello编写。TLD代码由托马斯·雅各布。Java实现是由Oliver Hitz贡献的。C#实现是由Alexander Gnauck贡献的。这个Unicode表格由Unicode,Inc.提供处理Unicode(参见nfkc.c和toutf8.c)是从GLib,下载自http://www.gtk.org/.借用的手册Werner Koch的Libgcrypt文本。

有意识或无意识地对许多事情产生灵感这个包是由于一些免费软件包作者已接触到。作者希望免费一般来说,软件社区提供了一个关于什么角色的示例软件开发可以在现代社会中发挥作用。

一些人报告了错误,发送了补丁或建议改进,请参阅源代码顶级目录中的THANKS文件。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

15历史

用户可见更改的完整历史记录存储在文件中新闻在源代码树的顶级目录中。这个每个文件的完整修改历史记录存储在该文件中更改日志在同一目录中。本节包含一个该信息的浓缩版本,以“里程碑”的形式用于项目。

Stringprep实现。

版本0.0.0发布于2002-11-05。

IDNA和Punycode实现,GNU项目的一部分。

0.1.0版本于2003年1月5日发布。

使用官方IDNA ACE前缀xn公司--.

版本0.1.7发布于2003-02-12。

命令行界面。

版本0.1.11发布于2003-02-26。

建议GNU Libc插件。

版本0.1.12发布于2003-03-06。

IDNConnect期间的互操作性测试。

版本0.3.1发布于2003-10-02。

TLD限制测试。

版本0.4.0发布于2004-02-28。

GNU Libc插件集成。

版本0.4.1发布于2004年3月8日。

本机Java实现。

版本0.4.2-0.4.9于2004-03-20和2004-06-11之间发布。

PR-29功能用于“问题序列”。

版本0.5.0发布于2004-06-26。

许多小的可移植性修复和更广泛的使用。

版本0.5.1至0.5.20,于2004-07-09和2005-10-23.

本机C#实现。

版本0.6.0发布于2005-12-03。

通过交叉编译支持Windows。

版本0.6.1发布于2006-01-20。

发布v1.0后,库被声明为稳定。

版本1.0发布于2007-07-31。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

附录A PR29讨论

如果您希望尝试修改后的Unicode NFKC实现根据PR29提案,您可能会发现以下错误报告非常有用。然而,我没有验证建议的修改都是正确的。为了便于参考,我在报告中附上了我的回应也。

发件人:Rick McGowan<rick@unicode.org>主题:PR 29变更的可能错误和状态收件人:bug-libidn@gnu.org日期:2004年10月27日星期三14:49:17-0700你好。我代表Unicode Consortium编辑委员会想了解有关PR 29修复的更多信息(如果有的话),以及Libidn中的函数。您的实现在PR29文本中列出为需要调查,所以我正在跟踪几个实现。UTC已接受PR29中概述的D2建议修复UAX#15草案已经发布。我已经看过了Libidn 0.5.8(今天),可能还有NFKC.java和NFKC.c中的错误。------------------------------------------------------1.在NFKC.java中,canonicalOrdering()中的此行:如果(i>0&&(lastcc==0|lastcc!=cc){可能应更改为:如果(i>0&&(last_cc==0|last_cc<cc)){但我不确定这种比较的意义。------------------------------------------------------2.在nfkc.c中,函数_g_utf8_normalize_wc()具有以下代码:如果(i>0&&(last_cc==0||last_cc!=cc)&&组合(wc_buffer[last_start]、wc_buffer[i],&wc缓冲区[最后启动])){这似乎与当前的Python实现(在Python 2.3.4)。应根据新规则D2 UAX#15检查代码更新,下一个组合字符与当前的。它现在检查它是否为非零和不相等。上述行可能应更改为:如果(i>0&&(last_cc==0||last_cc<cc)&&组合(wc_buffer[last_start],wc_buffer[i],&wc缓冲区[最后启动])){但我不确定这里的比较意义(<或>或<=?)。在PR29的文本中,我将把Libidn标记为“needs change”,并添加我检查的版本号。如果有任何进一步的更改,请让我知道发布版本,我会再次更新。当做,麦高恩
发件人:Simon Josefsson<jas@extundo.com>主题:回复:PR 29变更的可能错误和状态收件人:Rick McGowan<rick@unicode.org>复写的副本:bug-libidn@gnu.org日期:2004年10月28日星期四09:47:47+0200里克·麦高文(Rick McGowan)<rick@unicode.org>写入:>你好。我代表Unicode Consortium编辑委员会>想了解有关PR29修复的更多信息(如果有),以及>Libidn中的函数。您的实现在PR29文本中列出为>需要调查,所以我正在跟踪几个实现。>>UTC已接受PR29中概述的D2建议修复>UAX#15草案已经发布。>>我已经看过了Libidn 0.5.8(今天),可能还有>NFKC.java和NFKC.c中的错误。你好,瑞克。我认为目前的行为是有意的。Libidn的目标不是实施最新和最伟大的NFKC,旨在实施NFKCStringPrep和IDN所需的功能。你可能知道,StringPrep/IDN引用Unicode 3.2.0,并在以后明确表示变更(我认为是PR29)不适用。事实上,我相信我会把PR29,我实际上违反了IDN规范。感谢您查看代码并找到可以做出改变。我看看能不能在手册中提到这一点某个地方,给技术感兴趣的读者。当做,西蒙

下一步:,上一个:,向上:GNU图书馆  [目录][索引]

附录B标签上分隔符

某些字符串包含NFKC规范化形式包含的字符ASCII点(0x2E,“.”)。这些字符的例子是U+2024(一点领先)和U+248C(数字五位全停)。字符串具有IDNA ToASCII输出将包含的有趣属性嵌入点。例如:

ToASCII(hi U+248C com)=hi5.comToASCII(räksmörgás U+2024 com)=xn-rksmrgs.com-l8as9u

这演示了两种一般情况:第一种情况是ASCII点是不以IDN前缀开头的输出的一部分x个--。第二个示例说明了点是IDN前缀为x个--.

从DNS的角度来看,输入字符串是一个标签。IDNA算法一次翻译一个标签。因此,输出是预期只有一个标签。这里重要的是确保DNS解析程序接收正确的查询。DNS协议可以不是使用点来分隔导线上的标签,而是使用长度值对。因此,正确的查询应该是{7} hi5.com公司{22}xn-rksmrgs.com-l8as9u分别是。

一些实现1已经决定这些输入字符串可能会让用户感到困惑。这个一串你好U+248C com看起来像hi5.com网站在以下系统上正确支持Unicode。这些实现不遵循RFC3490。它们产生:

ToASCII(hi U+248C com)=hi5.comToASCII(räksmörgás U+2024 com)=xn-rksmrgs-5wao1o.com

他们执行的DNS查询是{3} 高5{3} com公司{18} xn--标记mrgs-5wao1o{3} com公司分别是。可以说,这个带来更好的用户体验,并建议IDNA规范在这方面是次优的。

下一步:,上一个:,向上:GNU图书馆  [目录][索引]

附录C GNU免费文档许可

版本1.3,2008年11月3日
版权所有©2000、2001、2002、2007、2008自由软件基金会。网址:https://fsf.org/每个人都可以复制和分发原稿但不允许更改它。
  1. 序言

    本许可证的目的是制作手册、教科书或其他实用文档自由的在自由的意义上:确保每个人都有复制和再版的有效自由,无论是否进行商业或非商业修改。其次,本许可证为作者和出版商保留了一种方式在不被视为负责任的情况下,为自己的工作赢得荣誉其他人进行的修改。

    本许可证是一种“copyleft”,即衍生产品文件的作品本身必须在同样的意义上是自由的。补充了GNU通用公共许可证,这是一个版权为自由软件设计的许可证。

    我们设计此许可证是为了将其免费用于手册软件,因为自由软件需要免费文档:免费程序应随附手册,提供与软件可以。但本许可证不限于软件手册;它可以用于任何文本工作,无论主题或是否以印刷书的形式出版。我们推荐此许可证主要用于以指导或参考为目的的作品。

  2. 适用性和定义

    本许可证适用于任何介质中的任何手册或其他工作包含版权所有者发布的通知,表示可以根据本许可条款分发。此类通知授予在全球范围内,免版税许可,无限期使用在此处规定的条件下工作。下面的“文档”,指任何此类手册或作品。任何公众成员都是被许可人,并被称为“您”。如果您接受许可证以需要许可的方式复制、修改或分发作品根据版权法。

    文件的“修改版本”是指包含文件或其中的一部分,可以逐字复制,也可以与修改和/或翻译成另一种语言。

    “次要部分”是一个命名的附录或重要部分专门处理文档的出版商或作者主题(或相关事项)且不包含任何可能坠落的内容直接在整个主题中。(因此,如果文件在数学教科书的第二部分可能无法解释任何数学。)这种关系可能是历史问题与主题或相关事项或法律的联系,商业、哲学、道德或政治立场他们。

    “不变部分”是某些次要部分,其标题为在通知中被指定为不变量节说明文件是根据本许可证发布的。如果第节不符合上述二级定义,则不符合允许指定为不变量。文件可能包含零不变节。如果文档没有标识任何不变量那么就没有节了。

    “封面文本”是列出的某些文本短文,作为前覆盖文本或后覆盖文本,在通知中指出文件根据本许可证发布。正面文字可能最多为5个单词,背越文本最多为25个单词。

    文件的“透明”副本是指机器可读副本,以其规范可用于适用于修订文件的公众直接使用通用文本编辑器或(对于由像素)通用绘图程序或(用于绘图)一些广泛可用的绘图编辑器,适合输入到文本格式化程序或用于自动转换为各种适合输入的格式到文本格式化程序。在其他透明文件中制作的副本其标记或无标记已被安排阻止的格式或阻止读者进行后续修改是不透明的。如果图像格式用于任何大量内容,则该格式是不透明的文本的。不“透明”的副本称为“不透明”。

    适用于透明副本的格式示例包括普通格式无标记ASCII、Texinfo输入格式、LaTeX输入格式、SGML或XMLDTD和符合标准的简单HTML,PostScript或PDF设计用于人工修改。示例透明图像格式包括PNG、XCF和JPG公司。不透明格式包括可以只能由专用文字处理器、SGML或DTD和/或处理工具用于的XML通常不可用,以及机器生成的HTML,某些文字处理器为生成的PostScript或PDF仅用于输出目的。

    “扉页”对于印刷书籍而言,是指扉页本身,加上以下这些页面,以便清晰地保存材料此许可证要求出现在标题页中。对于中的工程没有标题页的格式,“标题页”是指靠近作品标题最显著外观的文本,在正文开头之前。

    “出版商”是指分发副本的任何个人或实体向公众公布文件。

    “标题XYZ”部分是指文件的命名子单元,其标题要么是精确的XYZ,要么在后面的括号中包含XYZ用另一种语言翻译XYZ的文本。(此处XYZ代表下面提到的特定节名称,例如“确认”,“专用”、“背书”或“历史”。)“保留标题”当您修改文档时,这意味着它仍然是根据此定义,“授权XYZ”部分。

    该文件可能在通知旁边包括保修免责声明声明本许可证适用于文档。这些保证免责声明被视为通过引用包含在本文件中许可,但仅限于免责保证:任何其他这些保证免责声明可能具有的含义是无效的不影响本许可的含义。

  3. 口头复制

    您可以在任何介质中复制和分发文档商业或非商业,前提是本许可版权声明,以及说明本许可证适用的许可声明文件的所有副本均已复制,并且您没有添加其他副本本许可的任何条件。您不能使用阻碍或控制读数或进一步读数的技术措施复制您制作或分发的副本。然而,您可以接受补偿以换取副本。如果你分配的数量足够大副本数量还必须遵循第3节中的条件。

    您也可以在上述相同条件下借出副本,以及你可以公开展示副本。

  4. 大量复制

    如果您发布打印副本(或在通常具有印刷封面),编号超过100,以及文档的许可证通知需要封面文本,您必须将封面上的副本清晰易读地载有所有这些封面文本:封面上的前盖文本和封面上的后盖文本封底。两个封盖也必须清楚易读地标识你是这些副本的出版商。前盖必须存在完整的标题,标题中的所有单词都同样突出,以及可见。您还可以在盖子上添加其他材料。复制时更改仅限于封面,只要保留文件标题,并满足这些条件,则可以进行处理在其他方面进行逐字复制。

    如果任一封面所需的文本太长而无法容纳你应该清楚地列出第一个(尽可能多)合理),并将其余部分继续放置在相邻的页。

    如果您发布或分发文档编号的不透明副本超过100,则必须包含机器可读的透明副本连同每个不透明副本,或在每个不透明拷贝中声明通用网络使用的计算机网络位置public可以使用公共标准网络协议进行下载文件的完整透明副本,无附加材料。如果您使用后一种方法,您必须采取合理谨慎的步骤,当您开始大量分发不透明副本时,以确保此透明副本将在规定的位置,直到您上次分发不透明的副本(直接或通过您的代理或零售商)向公众发布。

    我们要求您联系在重新分发大量副本之前,要做好文档准备他们有机会为您提供文档的更新版本。

  5. 修改

    您可以复制和分发文档的修改版本上述第2节和第3节的条件,前提是您发布此许可证下的修改版本版本填补了文档的角色,从而许可了分发并向拥有副本的人修改修改版本此外,您必须在修改版本中执行以下操作:

    1. 在标题页(以及封面,如果有)中使用不同的标题本文件和以前版本的文件(如果有,应在历史记录部分列出)。您可以使用与以前版本相同的标题如果该版本的原始发布者给予许可。
    2. 标题页上的列表,作为作者、一个或多个个人或实体负责修改内容的作者版本,以及至少五位主要作者文件(所有主要作者,如果少于五名),除非他们解除你的这个要求。
    3. 在标题页上注明修改版本,作为发布者。
    4. 保留文档的所有版权声明。
    5. 为您的修改添加适当的版权声明与其他版权声明相邻。
    6. 在版权声明之后立即包括许可通知授予公众使用修改版本的权限本许可证条款,格式见下文附录。
    7. 在该许可证通知中保留不变部分的完整列表以及文件许可通知中规定的封面文本。
    8. 包括本许可证的未更改副本。
    9. 保留标题为“历史”的部分,保留其标题,并添加至少说明标题、年份、新作者和标题页上给出的修改版本的发布者。如果文档中没有标题为“历史”的部分,请创建一个说明文档的标题、年份、作者和出版商然后添加一个描述修改的上句所述版本。
    10. 保留文档中给定的网络位置(如果有)公开访问文档的透明副本,同样文档中给出的早期版本的网络位置它是基于的。这些可以放在“历史”部分。您可以省略发布于的作品的网络位置文件本身之前至少四年,或如果原件它所指版本的发布者授予权限。
    11. 对于任何标题为“确认”或“奉献”的部分,保留节的标题,并在节中保留所有每个贡献者致谢的内容和语气和/或其中给出的献词。
    12. 保留文档的所有不变部分,他们的文字和标题都没有改变。章节编号或同等内容不被视为章节标题的一部分。
    13. 删除任何标题为“背书”的部分。这样一个部分可能不包括在修改版本中。
    14. 不要将任何现有章节重新命名为“背书”或与任何固定节的标题冲突。
    15. 保留任何保修免责声明。

    如果修改版包含新的正面内容部分或符合次要章节要求且不包含任何材料的附录从文件中复制,您可以选择指定部分或全部作为不变量。要执行此操作,请将其标题添加到修改版本的许可通知中的不变部分列表。这些标题必须与任何其他章节标题不同。

    您可以添加一个名为“背书”的部分,前提是它包含只不过是各种人对修改版本的背书例如,各方、同行评审声明或文本被组织批准为标准。

    您可以添加最多五个单词的段落作为Front-Cover Text,以及将多达25个单词作为背景文本传递到列表末尾修订版封面文本。只有一条通道正面覆盖文本和背面覆盖文本之一可以通过(或)添加通过任何一个实体作出的安排。如果文档已经包含同一封面的封面文本,该文本是您或通过您所代表的同一实体作出的安排,您不能再添加一个;但您可以在显式添加旧版本的前一个发布者的许可。

    本文档的作者和出版商不受本许可允许使用他们的名字进行宣传或断言或暗示认可任何修改版本。

  6. 合并文档

    您可以将该文件与根据本协议发布的其他文件合并许可,根据上文第4节中定义的条款进行修改版本,前提是在组合中包含所有所有原始文档的不变节,未修改,以及在它的许可证通知,并且您保留其所有保修免责声明。

    合并作品只需包含本许可证的一份副本,并且多个相同的不变部分可以替换为单个副本。如果有多个名称相同但不同的内容,通过在末尾加上括号中的原始名称该部分的作者或出版商(如果已知),或者一个唯一的数字。对列表中的章节标题进行相同的调整组合作品的许可证通知中的不变部分。

    在组合中,您必须组合标题为“历史”的任何部分在各种原始文件中,形成一个标题为“历史”;同样,将标题为“确认”的任何部分合并,以及任何标题为“奉献”的章节。您必须删除所有标题为“背书”的章节

  7. 文件的收集

    您可以制作一个由文档和其他文档组成的集合根据本许可证发布,并替换本各种文件中的许可证,其中包含一份副本集合,前提是您遵守本许可证的规则在所有其他方面逐字复制每个文件。

    您可以从这样的集合中提取单个文档,然后分发在本许可证下单独提供,前提是您插入本将许可证放入提取的文档中,并完全遵循此许可证有关该文件逐字复制的其他方面。

  8. 独立工程聚合

    文件或其衍生文件与其他单独文件的汇编以及在存储或如果版权汇编的结果并不是用来限制合法权利的超出个人作品允许的范围。当文档包含在集合中时,本许可证不会适用于不属于其自身的其他工程本文件的衍生作品。

    如果第3节的封面文本要求适用于文件副本,如果文件少于整个集合,文档的封面文本可以放在涵盖将文档置于聚合范围内,或如果文件为电子形式,则等同于保险单的电子版本。否则,它们必须出现在印刷封面上骨料。

  9. 翻译

    翻译被认为是一种修改,所以你可以根据第4节的条款分发文件的译文。用翻译替换不变节需要特殊的版权持有人的许可,但您可以包括除了这些不变节的原始版本。您可以包括本许可证的翻译,以及文件和任何保修免责声明,前提是您还包括本许可证的英文原件和原件这些通知和免责声明。如果双方意见不一致本许可证或通知的译文和原始版本或免责声明,以原始版本为准。

    如果文件中的一节标题为“确认”,“奉献”或“历史”,保存要求(第4节)其标题(第1节)通常需要更改实际标题。

  10. 终止

    您不得复制、修改、再授权或分发文档除非本许可证明确规定。任何尝试否则,对其进行复制、修改、再许可或分发是无效的,并且将自动终止您在本许可证下的权利。

    但是,如果您停止所有违反本许可证的行为,那么您的许可证从特定版权持有人处获得恢复(a)暂时,除非版权持有人明确且最终终止您的许可,以及(b)如果版权持有人未能在停止后60天。

    此外,您从特定版权持有人处获得的许可是如果版权持有人通知您通过一些合理的方式违反,这是你第一次收到违反本许可证的通知(对于任何作品)版权所有者,并且您在30天内纠正了违规行为你收到通知了。

    终止您在本节项下的权利并不终止根据以下规定从您处收到副本或权利的各方的许可本许可证。如果您的权利已终止且不是永久性的恢复,收到部分或全部相同材料的副本没有给你任何使用它的权利。

  11. 本许可证的未来修订

    自由软件基金会可能会发布新的修订版本GNU自由文档许可证。这么新的版本在精神上与当前版本相似,但可能在细节上有所不同,以解决新的问题或关注点。请参见https://www.gnu.org/licenses网站/.

    许可证的每个版本都有一个不同的版本号。如果文件规定许可证“或任何更高版本”适用于它,您可以选择遵循指定版本或自由软件基金会。如果文档未指定版本此许可证的编号,您可以选择任何已发布的版本(不是作为草案)。如果文件指定代理可以决定此的未来版本可以使用许可证,该代理人公开声明接受版本永久授权您为文件。

  12. 释放

    “大规模多作者协作网站”(或“MMC网站”)指任何发布可受版权保护的作品的万维网服务器为任何人编辑这些作品提供了显著的工具。A类任何人都可以编辑的公共wiki就是这样一个服务器的例子。A类“大规模多作者合作”(或“MMC”)包含在网站是指在MMC上发布的任何受版权保护的作品现场。

    “CC-BY-SA”是指知识共享署名共享3.0非营利组织Creative Commons Corporation发布的许可主要营业地位于旧金山的公司,加利福尼亚州,以及该许可证的未来版权版本由同一组织发布。

    “合并”是指发布或重新发布整个文件或作为另一文件的一部分。

    如果MMC根据本协议获得许可,则其“有资格重新获得许可”许可证,以及根据本许可证首次发布的所有作品除MMC之外的其他地方,并随后并入整体或部分进入MMC,(1)没有封面文本或不变部分,和(2)因此在2008年11月1日之前合并。

    MMC网站的运营商可以重新发布网站中包含的MMC在2009年8月1日之前的任何时间在同一地点根据CC-BY-SA,前提是MMC有资格重新获得许可。

附录:如何将此许可证用于您的文档

要在您编写的文档中使用本许可证,请包括文件中的许可,并将以下版权和标题页后面的许可证通知:

版权(C)  你的名字.授予复制、分发和/或修改本文件的权限根据GNU免费文档许可证1.3版的条款或自由软件基金会发布的任何更新版本;没有不变节,没有前覆盖文本,也没有后覆盖文本。许可证副本包含在标题为“GNU”的部分中免费文档许可证“”。

如果有固定节、前覆盖文本和后覆盖文本,将“with…Texts.”行替换为:

不变部分为列出他们的标题,使用Front-Cover文本正在列表、和背面文本存在列表.

如果你有没有封面文字的不变部分,或其他一些三者的结合,将这两个备选方案合并以适应情况。

如果您的文档包含程序代码的重要示例,我们建议根据您的选择并行发布这些示例自由软件许可,如GNU通用公共许可,允许在自由软件中使用它们。


下一步:,上一个:,向上:GNU图书馆  [目录][索引]

函数和变量索引

跳转到: P(P)  T型 
索引条目 章节

从idna到ascii: Emacs API
idna到unicode: Emacs API
idna存储错误: IDNA函数
idna_to_ascii_4i: IDNA函数
idna_to_ascii_4z: IDNA函数
idna_to_ascii_8z: IDNA函数
idna_to_ascii_lz: IDNA函数
idna_to_unicode _44i: IDNA函数
idna_to_unicode 4z4z: IDNA函数
idna_to_unicode 8z4z: IDNA函数
idna_to_unicode 8z8z: IDNA函数
idna_to_unicode 8zlz: IDNA函数
idna_to_unicode _lzlz: IDNA函数
idn免费: Windows下的内存处理

P(P)
pr294型: PR29功能
pr29_4赫兹: PR29功能
pr29_8z码: PR29功能
pr29_错误: PR29功能
punycode-decode码: Emacs API
punycode编码: Emacs API
puny代码_代码: Punycode函数
punycode_encode码: Punycode函数
punycode_strerror错误: Punycode函数

字符串代表: Stringprep函数
字符串rep_4i: Stringprep函数
字符串rep_4zi: Stringprep函数
字符串rep_check_version: 版本检查
字符串rep_convert: 实用程序功能
字符串rep_iscsi: Stringprep函数
字符串rep_locale_charset: 实用程序功能
字符串rep_locale_to_utf8: 实用程序功能
字符串rep_nameprep_no_未分配: Stringprep函数
字符串rep_plain: Stringprep函数
字符串rep_配置文件: Stringprep函数
字符串rep_strerror: Stringprep函数
字符串rep_ucs4_nfkc_normalize: 实用程序功能
字符串rep_ucs4_to_utf8: 实用程序功能
字符串rep_unichar_to_utf8: 实用程序功能
字符串rep_utf8_nfkc_normalize: 实用程序功能
字符串rep_utf8_to_locale: 实用程序功能
字符串rep_utf8_to_ucs4: 实用程序功能
字符串rep_utf8_to_unichar: 实用程序功能
字符串rep_xmpp_nodeprep: Stringprep函数
字符串rep_xmpp_resourceprep: Stringprep函数

T型
tld检查4: TLD函数
tld检查4t: TLD函数
tld检查4tz: TLD函数
tld检查4z: TLD函数
tld检查8z: TLD函数
tld检查_lz: TLD函数
tld默认表: TLD函数
tld获取4: TLD函数
tld获取4z: TLD函数
tld获取表: TLD函数
tld获取z: TLD函数
tldstrerror错误: TLD功能

跳转到: P(P)  T型 

上一页:,向上:GNU图书馆  [目录][索引]

概念索引

跳转到:A类 C类 D类 E类 F类 H(H)  M(M) N个 O(运行) P(P) R(右)  T型 U型 W公司 
索引条目 章节

A类
AIX(AIX): 支持的平台
ARM公司: 支持的平台
Autoconf测试: Autoconf测试

C类
命令行: 调用idn
编译应用程序: 构建源代码
配置测试: Autoconf测试
贡献: 贡献

D类
取消分配: Windows下的内存处理
Debian公司: 支持的平台
Debian公司: 支持的平台
下载: 下载和安装

E类
示例: 示例

F类
自由的: Windows下的内存处理
自由BSD: 支持的平台

H(H)
黑客攻击: 贡献
堆内存: Windows下的内存处理
HP-UX系列: 支持的平台

国际商用机器公司: 支持的平台
国际数字网络: 调用idn
IDNA函数: IDNA函数
安装: 下载和安装
调用国际数字网络: 调用idn
IRIX公司: 支持的平台

M(M)
MacOS X操作系统: 支持的平台
MacOS X操作系统: 支持的平台
Mandrake公司: 支持的平台
内存处理: Windows下的内存处理
微软: 支持的平台
明w32: 支持的平台
摩托罗拉Coldfire: 支持的平台

N个
网络BSD: 支持的平台

O(运行)
OpenBSD(打开BSD): 支持的平台
OpenPower 720公司: 支持的平台
操作系统/2: 支持的平台

P(P)
PR29功能: PR29功能
Punycode函数: Punycode函数

R(右)
RedHat公司: 支持的平台
RedHat公司: 支持的平台
RedHat公司: 支持的平台
RedHat高级服务器: 支持的平台
报告Bug: 错误报告

Solaris公司: 支持的平台
Solaris公司: 支持的平台
Solaris公司: 支持的平台
Stringprep函数: Stringprep函数
SuSE公司: 支持的平台
SuSE Linux: 支持的平台
SuSE Linux: 支持的平台
SuSE Linux: 支持的平台

T型
TLD函数: TLD函数
Tru64系列: 支持的平台

U型
uClibc公司: 支持的平台
uClinux公司: 支持的平台
实用程序功能: 实用程序功能

W公司
窗户: 支持的平台
窗户: 支持的平台

跳转到:A类 C类 D类 E类 F类 H(H)  M(M) N个 O(运行) P(P) R(右)  T型 U型 W公司 

脚注

(1)

特别是Microsoft的Internet Explorer和Mozilla的Firefox,但不是苹果的Safari。