Unix版权符号不起作用

use*_*r01 0 unix perl

当我尝试在perl中向变量插入版权符号值时,它转换为另一个符号

我需要

$a=©;
Run Code Online (Sandbox Code Playgroud)

但我得到了这样的

$a =©
Run Code Online (Sandbox Code Playgroud)

请给我解决方案

Ric*_*ton 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-15中的文件告诉ISO-8859-1中的文件.在一个中,字节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"
}
Run Code Online (Sandbox Code Playgroud)

P - 这是你应对21世纪角色所需要知道的绝对最低限度.当你开始尝试处理这些东西时,有大量的细节(什么是数字?什么是标点符号,我如何小写?).阅读这篇文章了解血腥细节.哦 - 当你这样做的时候,请记住Perl应该比大多数语言更好.

PS - Unicode专家.是的,我意识到这过于简化了很多细节,但我想传达基础知识,而不是像链接帖子那样令人恐惧.