当我尝试将版权符号值插入perl中的变量时,它转换为另一个符号
我需要
$a=©;
但我喜欢这个
$a =©
请给我解决方案
答案 0 :(得分:5)
好的 - 您需要了解有关字符编码的信息。
有一种称为字符集的东西 - 它是一组有效字符(“A”,“z”,“1”,“£”等)。 perl字符串通常包含字符。 Perl的字符集包括世界上的一切(然后更多)。
现在,集合中的每个字符都有一个数字(代码点),因此我们知道我们在谈论什么(65 =“A”在很多集合中,但不一定都是所有集合)。传统上,不同的国家/计算机公司为某些角色提出了自己的代码(在英国,“£”被认为是重要的,在美国则不那么重要)。所以 - 我们需要知道在交换信息时我们想要使用什么字符集。
然而,当我们写入文件或通过网络发送消息时,我们写入字节,只能保存数字0-255。那么 - 我们如何处理代码点大于255的字符?
我们需要编码。这是一组规则,说明如何将我们的代码点转换为字节。
Unicode是一个包含几乎所有使用过的书面符号的字符集(它们也一直在添加它)。它有许多编码,其中最常见的是UTF-8。对于大于127的数字,UTF-8编码使用多个字节(如果您关心原因,请使用谷歌)。
ISO-8859-1是基于欧洲的字符集和编码(每个字符一个字节)。它在ISO-8859-15中进行了修订,其中介绍了欧元“€”符号。两者都只占Unicode标准中的一小部分字符(没有阿拉伯语,中文,笑脸等)。
没有理解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"
}
P p - 这是你应对21世纪人物所需要知道的绝对最低限度。当你开始尝试处理这些东西时,有大量的细节(什么是数字?什么是标点符号,我如何小写?)。阅读this post了解血腥细节。哦 - 当你这样做的时候,记住Perl应该比大多数语言更好。
P.S。 - Unicode专家。是的,我意识到这过于简化了很多细节,但我想传达基础知识,而不是像链接帖子那样令人恐惧。
答案 1 :(得分:1)
问题是你如何得到你所得到的:
在UTF-8中,©
表示为双字节字符A9 C2
。
在Windows代码页1250(美国的默认代码页)中,A9 C2
代表两个字符:Â
和©
。
你没有说你做了什么或做了什么。您是否将变量键入为$a = "©"
,但它显示为$a = "Ä©"
,或者您在一个位置键入了Perl脚本,但它在其他地方显示为错误的变量。或者,如果您正在运行Perl脚本,请输入©
作为输入,但输出Ä©
。
我不打算重复Richard Huxton's解释,但你需要了解字符的表示方式。
答案 2 :(得分:0)
背景是什么?如果您将其打印到控制台,其他评论员是正确的,您需要使用正确的编码,然后$a="©";
应该没问题。如果您正在写一个网页,那么使用$a="©"
可能更明智,因此浏览器会正确解释它。