内容

名称

utf8 - Perl pragma 用于启用/禁用源代码中的 UTF-8(或 UTF-EBCDIC)

概要

use utf8;
no utf8;

# Convert the internal representation of a Perl scalar to/from UTF-8.

$num_octets = utf8::upgrade($string);
$success    = utf8::downgrade($string[, $fail_ok]);

# Change each character of a Perl scalar to/from a series of
# characters that represent the UTF-8 bytes of each original character.

utf8::encode($string);  # "\x{100}"  becomes "\xc4\x80"
utf8::decode($string);  # "\xc4\x80" becomes "\x{100}"

# Convert a code point from the platform native character set to
# Unicode, and vice-versa.
$unicode = utf8::native_to_unicode(ord('A')); # returns 65 on both
                                              # ASCII and EBCDIC
                                              # platforms
$native = utf8::unicode_to_native(65);        # returns 65 on ASCII
                                              # platforms; 193 on
                                              # EBCDIC

$flag = utf8::is_utf8($string); # since Perl 5.8.1
$flag = utf8::valid($string);

说明

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

不要将此 pragma 用于除告诉 Perl 脚本以 UTF-8 编写之外的任何其他用途。下面描述的实用程序函数可以直接使用,无需 use utf8;

由于无法可靠地将 UTF-8 与本机 8 位编码区分开来,因此您需要在源代码的开头使用字节顺序标记或 use utf8; 来指示 perl。

当 UTF-8 成为标准源格式时,此编译指示将有效地成为无操作。

另请参阅 -C 开关及其表亲 PERL_UNICODE 环境变量在 perlrun 中的效果。

启用 utf8 编译指示具有以下效果

请注意,如果您的脚本中包含非 ASCII、非 UTF-8 字节(例如字符串字面值中嵌入的 Latin-1),use utf8 将不满意。如果您希望在 use utf8 下拥有此类字节,则可以通过 no utf8; 禁用此编译指示,直到块(或文件,如果在顶级)结束。

实用程序函数

Perl 核心在 utf8:: 包中定义了以下函数。您无需说 use utf8 来使用这些函数,事实上,除非您真的想要 UTF-8 源代码,否则您不应该这么说。

utf8::encode 类似于 utf8::upgrade,但 UTF8 标志已清除。请参阅 perlunicode 和 C API 函数 sv_utf8_upgrade"sv_utf8_downgrade" in perlapi"sv_utf8_encode" in perlapi"sv_utf8_decode" in perlapi,它们由 Perl 函数 utf8::upgradeutf8::downgradeutf8::encodeutf8::decode 包装。此外,函数 utf8::is_utf8utf8::validutf8::encodeutf8::decodeutf8::upgradeutf8::downgrade 实际上是内部的,因此始终可用,而无需 require utf8 语句。

错误

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

另请参阅

perlunitutperluniintroperlrunbytesperlunicode