当我尝试将版权符号值插入 perl 中的变量时,它转换为另一个符号
我需要
$a=©;
但我得到了这样的
$a =©
请给我解决方案
好的 - 你需要了解一些关于字符编码的知识。
有一种叫做字符集的东西——它是一组命名的有效字符(“A”、“z”、“1”、“£”等)。perl 字符串通常包含字符。Perl 的字符集包括世界上的一切(甚至更多)。
现在,集合中的每个字符都有一个数字(代码点),所以我们知道我们在说什么(在许多集合中为 65="A",但不一定是全部)。传统上,不同的国家/计算机公司为某些字符提出了自己的代码(在英国,“£”被认为很重要,而在美国则不那么重要)。所以 - 我们需要知道在交换信息时我们想要使用什么字符集。
但是,当我们写入文件或通过网络发送消息时,我们会写入字节,这些字节只能保存数字 0-255。那么 - 我们如何处理代码点大于 255 的字符?
我们需要一个编码。这是一组规则,说明如何将我们的代码点转换为字节。
Unicode 是一个字符集,包含几乎所有曾经使用过的书面符号(他们也在不断添加)。它有许多编码,其中最常见的是 UTF-8。UTF-8 编码对大于 127 的数字使用多个字节(如果您关心为什么,请使用 Google)。
ISO-8859-1 是基于欧洲的字符集和编码(每个字符一个字节)。它在 ISO-8859-15 中进行了修订,其中引入了欧元“€”符号。两者都只包含 Unicode 标准中字符的一小部分(没有阿拉伯语、中文、笑脸等)。
如果不了解 ISO-8859-1 中的文件在说什么,就无法区分 ISO-8859-1 中的文件和 ISO-8859-15 中的文件。其中一个字节 0xA4 在另一个“€”中表示“¤”。
有时可能会发现 UTF-8 文件,因为它有一些关于如何生成大代码点的规则。
在您的情况下,版权符号的这两个字符?它们是该字符的 UTF-8 编码。你大概是用 ISO-8859-something 或 Windows-something 输入的。
下面是一个小脚本来说明我的意思。它以两种编码打印出“test©”,显示用于两者的字节(八位字节)。您的终端只会成功显示一个。
#!/usr/bin/perl
use strict;
use warnings;
use Encode qw(encode);
print_charcodes('UTF-8', 'test'.chr(169));
print_charcodes('ISO-8859-1', 'test'.chr(169));
exit;
sub print_charcodes {
my ($enc, $chars) = @_;
my $octets = encode($enc, $chars, Encode::FB_CROAK);
my @codes = map { ord $_ } split('', $octets);
print sprintf('%11s : ',$enc), join(" ", @codes), " : $octets", "\n"
}
呼——这是你在 21 世纪应对角色所需要知道的最低限度。当你开始尝试处理这些东西时,会有大量的细节(什么是数字?什么是标点符号,我如何小写?)。阅读这篇文章了解血腥的细节。哦 - 当你这样做时,请记住 Perl 在这方面应该比大多数语言更好。
PS - Unicode 专家。是的,我意识到这过度简化了很多繁琐的细节,但我想传达基本知识,而不是像链接的帖子那样可怕。
一个问题是你如何得到你得到的:
在 UTF-8 中,©
表示为一个两字节字符A9 C2
。
在 Windows 代码页 1250(美国的默认代码页)中,A9 C2
代表两个字符:Â
和©
.
你没有说你是怎么做的或做了什么。您是否在 as 中键入了变量$a = "©"
,但它显示为$a = "Ä©"
,或者您在一个地方键入了 Perl 脚本,但它在其他地方显示为错误的变量。或者,如果您正在运行 Perl 脚本,输入©
作为输入,但Ä©
作为输出。
我不会重复Richard Huxton 的解释,但您确实需要了解字符是如何表示的。
上下文是什么?如果您将其打印到控制台,其他评论员是正确的,您需要使用正确的编码,然后$a="©";
就可以了。如果您正在写入网页,使用它可能更明智,$a="©"
因此浏览器将正确解释它。