模块:utf8接口

名称

utf8-在源代码中启用/禁用UTF-8(或UTF-EBCDIC)的Perl杂注

简介

使用utf8;无utf8;#将Perl标量的内部表示转换为UTF-8。$num_octets=utf8::升级($string);$success=utf8::降级($string[,$fail_ok]);#将Perl标量的每个字符更改为/从一系列#表示每个原始字符的UTF-8字节的字符。utf8::编码($string);#“\x{100}”变为“\xc4\x80”utf8::解码($string);#“\xc4\x80”变为“\x{100}”#将平台本机字符集中的代码点转换为#Unicode和vice-versa。$unicode=utf8::native_to_unicode(ord('A'));#两者都返回65#ASCII和EBCDIC#平台$native=utf8::unicode _ to_ native(65);#ASCII返回65#平台;193年#EBCDIC公司$flag=utf8::is_utf8($string);#自Perl 5.8.1以来$flag=utf8::有效($string);

描述

这个使用utf8pragma告诉Perl解析器允许在当前词法范围内的程序文本中使用UTF-8。这个无utf8pragma告诉Perl切换回将源文本视为当前词法范围中的文字字节。(在EBCDIC平台上,从技术上讲,它允许使用UTF-EBCDIC,而不允许使用UTF-8,但这种区别是学术性的,因此在本文档中,术语UTF-8用于表示两者)。

除了告诉Perl您的脚本是用UTF-8编写的之外,不要将此杂注用于任何其他用途。下面描述的实用程序功能可直接使用,无需使用utf8;.

因为不可能可靠地区分UTF-8和本机8位编码,所以您需要在源代码的开头使用字节顺序标记,或者使用utf8;,以指导perl。

当UTF-8成为标准源格式时,此杂注将有效地成为禁止。

另请参见-C类switch及其堂兄弟PERL_UNICODE公司环境变量,in珀尔伦.

启用utf8接口pragma具有以下效果:

  • 源文本中不在ASCII字符集中的字节将被视为文字UTF-8序列的一部分。这包括大多数文字,如标识符名称、字符串常量和常量正则表达式模式。

请注意,如果脚本中有非ASCII、非UTF-8字节(例如,在字符串文字中嵌入拉丁语-1),使用utf8将不开心。如果你想在下面有这样的字节使用utf8,您可以通过以下方式禁用此杂注,直到块(或文件,如果在顶层)结束无utf8;.

实用程序功能

中定义了以下功能utf8::由Perl内核打包。你不需要说使用utf8事实上,除非你真的想要UTF-8源代码,否则你不应该这么说。

  • $num_octets=utf8::upgrade($string)

    (由于Perl v5.8.0)将字符串的内部表示从本机编码(拉丁语-1或EBCDIC)中的八位序列就地转换为UTF-8。逻辑字符序列本身没有改变。如果$string($string)已升级,则这是一个no-op。返回将字符串表示为UTF-8所需的八位字节数。自Perl v5.38以来,如果$字符串不设防的未采取任何行动;在此之前,它将被转换为定义的零长度。

    如果您的代码需要与没有使用功能“unicode字符串”;,可以对给定字符串强制使用Unicode语义:

    #强制$string的unicode语义,不使用#“unicode字符串”功能utf8::升级($string);

    例如:

    #没有显式或隐式使用功能“unicode字符串”我的$x=“\xDF”;#拉丁文小写字母尖S$x=~/ss/i;#不会匹配我的$y=uc($x);#不会转换utf8::升级($x);$x=~/ss/i;#比赛我的$z=uc($x);#转换为“SS”

    请注意,此函数不处理任意编码; 使用编码而不是。

  • $success=utf8::降级($string[,$fail_ok])

    (自Perl v5.8.0以来)将字符串的内部表示从UTF-8就地转换为本地编码(拉丁语-1或EBCDIC)中的等效八位序列。逻辑字符序列本身是不变的。如果$string($string)已存储为本机8位,则这是一个no-op。可用于确保UTF-8标志处于关闭状态,例如,当您希望确保substr()或length()函数与通常更快的字节算法一起工作时。

    如果原始UTF-8序列无法在本机8位编码中表示,则失败。失败时死亡,或如果$fail_ok(失败_确认)为true,返回false。

    成功时返回true。

    如果您的代码需要八位字节序列,则可以使用该序列验证您是否收到了一个八位字节:

    #如果不能表示为八位字节,则抛出异常utf8::降级($string)#或者自己处理错误utf8::降级($string,1)或死亡“字符串必须是八位字节”;

    请注意,此函数不处理任意编码; 使用编码而不是。

  • utf8::encode($string)

    (由于Perl v5.8.0)在Perl的扩展UTF-8中将就地字符序列转换为相应的八位字节序列。也就是说,每个(可能很宽的)字符都被替换为一个或多个字符序列,这些字符表示字符的单个UTF-8字节。UTF8标志已关闭。不返回任何内容。

    我的$x=“\x{100}”;#$x包含一个字符,其中ord为0x100utf8::编码($x);#$x包含两个字符,带有单词(on#ASCII平台)0xc4和0x80。在EBCDIC上#1047,这将是0x8C和0x41。

    类似:

    使用编码;$x=编码::编码(“utf8”,$x);

    请注意,此函数不处理任意编码; 使用编码而不是。

  • $success=utf8::解码($string)

    (自Perl v5.8.0以来)尝试将以Perl的扩展UTF-8编码的八位字节序列就地转换为相应的字符序列。也就是说,它用相应的单个字符替换字符串中的每个字符序列,这些字符的字表示有效的(扩展的)UTF-8字节序列。仅当源字符串包含多字节UTF-8字符时,才会启用UTF-8标志。如果$string($string)作为扩展UTF-8无效,返回false;否则返回true。

    我的$x=“\xc4\x80”;#$x包含两个字符,带有单词#0xc4和0x80utf8::解码($x);#在ASCII平台上,$x包含一个字符,#带有字0x100。因为这些字节不是#合法UTF-EBCDIC,在EBCDIC平台上,$x是#不变,函数返回FALSE。我的$y=“\xc3\x83\xc2\xab”;这已被编码两次;#示例仅适用于ASCII平台utf8::解码($y);#将$y转换为\xc3\xab,返回TRUE;utf8::解码($y);#进一步转换为\xeb,返回TRUE;utf8::解码($y);#返回FALSE,保持$y不变

    请注意,此函数不处理任意编码; 使用编码而不是。

  • $unicode=utf8::native_to_unicode($code_point)

    (自Perl v5.8.0以来)这接受一个无符号整数(表示运行程序的平台上的字符(或代码点)的序号)并返回其Unicode等效值。由于ASCII平台本机使用Unicode代码点,因此此函数将返回它们的输入。在EBCDIC平台上,它将EBCDIC转换为Unicode。

    如果输入不是无符号整数,则当前将返回无意义的值。

    由于Perl v5.22.0,对该函数的调用在ASCII平台上进行了优化,因此在那里使用它不会影响性能。

  • $native=utf8::unicode _ to_ native($code_point)

    (因为Perl v5.8.0)这是utf8::native_to_unicode(),转换另一个方向。同样,在ASCII平台上,它会返回其输入,但在EBCDIC平台上,如果给定任何Unicode代码点,它会找到本机平台代码点。

    如果输入不是无符号整数,则当前将返回无意义的值。

    由于Perl v5.22.0,对该函数的调用在ASCII平台上进行了优化,因此在那里使用它不会影响性能。

  • $flag=utf8::is_utf8($string)

    (自Perl 5.8.1以来)测试$string($string)内部标记为UTF-8编码。功能与编码::is_utf8($string).

    通常只有在调试和测试时才需要,如果您需要转储SV的内部,Devel::Peek's公司Dump()以简洁的形式提供了更多细节。

    如果您仍然认为除了调试、测试或处理文件名之外还需要这样做,您可能应该阅读珀鲁纽特perlunifaq中的“UTF8标志”是什么.

    不要将此标志用作区分字符和二进制数据的标记:这应该在编写代码时为每个变量确定。

    要在可移植到perl5.8和5.10的代码中强制使用unicode语义,请调用utf8::升级($string)无条件地。

  • $flag=utf8::有效($string)

    [INTERNAL]测试是否$字符串在UTF-8方面处于一致状态。如果它是格式良好的Perl扩展UTF-8并且启用了UTF-8标志,则返回true如果$string($string)以字节形式保存(这两种状态都“一致”)。这个例程的主要原因是允许Perl的测试套件检查操作是否使字符串处于一致状态。

utf8::编码就像是utf8::升级,但UTF8标志被清除。请参见perlunicode码和C API函数sv_utf8_升级,perlapi中的“sv_utf8_downgrade”,perlapi中的“sv_utf8_encode”、和perlapi中的“sv_utf8_decode”,由Perl函数包装utf8::升级,utf8::降级,utf8::编码utf8::解码。此外,功能utf8::is_utf8,utf8::有效,utf8::编码,utf8::解码,utf8::升级、和utf8::降级实际上是内部的,因此总是可用的,没有需要utf8声明。

漏洞

某些文件系统可能不支持UTF-8文件名,或者可能与Perl不兼容。因此,文件系统可见的UTF-8名称(例如模块名称)可能不起作用。

另请参阅

珀鲁纽特,珍珠岩,珀尔伦,字节,perlunicode码