这是 perlunitut 命令,可以使用我们的多个免费在线工作站之一(例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器)在 OnWorks 免费托管提供商中运行
程序:
您的姓名
perlunitut - Perl Unicode 教程
商品描述
仅仅随心所欲地扔绳子的日子已经结束了。 众所周知,现代
程序需要能够传达有趣的带口音的字母,比如欧元
符号。 这意味着程序员需要新的习惯。 很容易编写支持 Unicode 的程序
软件,但它确实需要纪律才能正确完成。
关于字符集和文本编码有很多东西需要了解。 最好是
花一整天的时间来学习所有这些,但基础知识只需几分钟即可学会。
不过,这些都不是最基本的。 假设您已经知道其中的区别
字节和字符之间,并意识到(并接受!)有许多不同的
字符集和编码,并且您的程序必须明确它们。
推荐阅读“每个软件开发人员的绝对最低限度,
必须了解 Unicode 和字符集(没有任何借口!)”作者:Joel Spolsky,网址:
<http://joelonsoftware.com/articles/Unicode.html>.
本教程使用的是相当绝对的术语,并且仅提供了有限的视图
Perl 提供了丰富的字符串相关功能。 对于大多数项目来说,
这些信息可能就足够了。
定义
首先弄清楚一些事情很重要。 这是最重要的部分
教程。 此视图可能与您在网站上找到的其他信息相冲突
网络,但这主要是因为许多来源都是错误的。
您可能需要重新阅读整个部分几次......
统一
统一 是一个可以容纳很多字符的字符集。 a 的序数值
字符被称为 码 点。 (但实际上,代码点之间的区别
并且字符模糊,因此这些术语经常互换使用。)
有很多很多的代码点,但是计算机使用字节来工作,并且一个字节有空间
只有 256 个值。 Unicode 的字符比这多得多,所以你需要一种方法来制作
这些可以访问。
Unicode 使用多种竞争编码进行编码,其中使用最多的是 UTF-8。 在
Unicode 编码,多个后续字节可用于存储单个代码点,或者
简单地说:性格。
UTF-8
UTF-8 是Unicode编码。 很多人认为Unicode和UTF-8是同一个东西,
但他们不是。 Unicode 编码有更多,但世界上大部分地区已经标准化
在 UTF-8 上。
UTF-8 对待前 128 个代码点 0..127,与 ASCII 相同。 它们只占用一个字节
每个字符。 所有其他字符都使用复杂的编码为两到四个字节
方案。 幸运的是,Perl 为我们处理了这个问题,所以我们不必担心这个问题。
文本 字符串 (特点 字符串)
文本 字符串或 字符 字符串 是由字符组成的。 字节在这里无关紧要,并且
编码也是如此。 每个角色就是:角色。
在文本字符串上,您可以执行以下操作:
$text =~ s/foo/bar/;
if ($string =~ /^\d+$/) { ... }
$text = ucfirst $text;
我的 $character_count = length $text;
字符的值(“ord”、“chr”)是相应的 Unicode 代码点。
二进制 字符串 (字节 字符串)
二进制 字符串或 字节 字符串 由字节组成。 在这里,你没有角色,只有
字节。 与外界的所有通信(当前 Perl 之外的任何内容)
process)以二进制形式完成。
对于二进制字符串,您可以执行以下操作:
my (@length_content) = 解压“(V/a)*”, $binary;
$二进制=~s/\x00\x0F/\xFF\xF0/; # 对于勇敢者:)
打印 {$fh} $binary;
我的 $byte_count = 长度 $binary;
喷码
喷码 (作为动词)是从 文本 至 二进制。 要编码,您必须提供
目标编码,例如“iso-8859-1”或“UTF-8”。 一些编码,例如
“iso-8859”(“拉丁语”)范围,不支持完整的 Unicode 标准; 字符
无法表示的部分会在转换中丢失。
解码
解码 是从 二进制 至 文本。 要解码,你必须知道什么编码
在编码阶段使用。 最重要的是,它必须是可解码的。 它
将 PNG 图像解码为文本字符串没有多大意义。
内部 格式
Perl 有一个 内部 格式,一种用于对文本字符串进行编码的编码,以便可以
将它们存储在内存中。 所有文本字符串均采用此内部格式。 事实上,文本字符串
绝不会采用任何其他格式!
您不必担心这种格式是什么,因为转换是自动完成的
当您解码或编码时。
您一站式解决方案 新 工具箱
将以下行添加到您的标准标题中:
使用编码qw(编码解码);
或者,如果你很懒,就:
使用编码;
I / O 流 ( 实际 5 分钟 教程)
程序的典型输入/输出流程是:
1. 接收并解码
2。 处理
3. 编码与输出
如果您的输入是二进制的,并且应该保持二进制,则不应将其解码为
当然是文本字符串。 但在所有其他情况下,您应该对其进行解码。
如果您不知道数据是如何编码的,则无法可靠地进行解码。 如果你到达
选择,标准化 UTF-8 是个好主意。
我的 $foo = 解码('UTF-8', 得到 'http://example.com/');
我的 $bar = 解码('ISO-8859-1', readline STDIN);
我的 $xyzzy = 解码('Windows-1251', $cgi->param('foo'));
处理过程如您之前所知。 唯一的区别是您现在使用的是
字符而不是字节。 如果您使用“substr”之类的东西,这非常有用,或者
“长度”。
重要的是要认识到文本字符串中没有字节。 当然,Perl 有
它的内部编码将字符串存储在内存中,但忽略它。 如果你必须这样做
任何与字节数相关的内容,最好将该部分移至步骤 3,只需
对字符串进行编码后。 然后你就知道它有多少字节了
目标字符串。
将文本字符串编码为二进制字符串的语法与解码一样简单:
$body = 编码('UTF-8', $body);
如果您需要知道字符串的长度(以字节为单位),那么现在是最佳时机。
因为 $body 现在是字节字符串,所以“length”将报告字节数,而不是
字符数。 字符的数量已经不知道了,因为字符
只存在于文本字符串中。
我的 $byte_count = 长度 $body;
如果您使用的协议支持让收件人知道哪个协议
您使用的字符编码,请帮助接收端使用该功能! 为了
例如,电子邮件和 HTTP 支持 MIME 标头,因此您可以使用“Content-Type”标头。
它们还可以有“Content-Length”来指示内容的数量 字节,这始终是一个
如果知道号码,最好提供。
“内容类型:文本/纯文本;字符集=UTF-8”,
“内容长度:$byte_count”
概要
解码您收到的所有内容,编码您发送的所有内容。 (如果是文本数据。)
Q 和 A (或 常问问题)
阅读完本文档后,您还应该阅读 perlunifaq,然后是 perluniintro。
致谢
感谢 Squirrel Consultancy 的 Johan Vromans。 他在阿姆斯特丹会议期间对 UTF-8 的咆哮
Perl Mongers 会议让我产生了兴趣并决心找出如何使用字符
Perl 中的编码方式不易被破坏。
感谢来自 TTY 的杰拉德·古森 (Gerard Goossen)。 他的演讲“野外的 UTF-8”(荷兰语 Perl
Workshop 2006)启发我发表了我的想法并编写了本教程。
感谢在几个 Perl IRC 频道中询问此类内容的人们,以及
不断提醒我需要一个更简单的解释。
感谢在这份文件公开之前为我审阅这份文件的人们。 他们是:
本杰明·史密斯、扬·彼得·科内特、约翰·弗罗曼斯、卢卡斯·麦、内森·格雷。
使用 onworks.net 服务在线使用 perlunitut