Perl Unix版权符号不工作

Perl Unix版权符号不工作,perl,unix,Perl,Unix,当我尝试在perl中向变量插入版权符号值时,它会转换为另一个符号 我需要 $a=©; 但我是这样的 $a =© 请告诉我解决方案好的-您需要了解一些字符编码 有一种称为字符集的东西——它是一组命名的有效字符(“a”、“z”、“1”、“1”等)。perl字符串通常包含字符。Perl的字符集包括世界上的一切(甚至更多) 现在,集合中的每个字符都有一个数字(代码点),因此我们知道我们在谈论什么(在许多集合中为65=“a”,但不一定是所有集合)。传统上,不同的国家/计算机公司为某些字符制定了自己的

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

我需要

$a=©;
但我是这样的

$a =©

请告诉我解决方案

好的-您需要了解一些字符编码

有一种称为字符集的东西——它是一组命名的有效字符(“a”、“z”、“1”、“1”等)。perl字符串通常包含字符。Perl的字符集包括世界上的一切(甚至更多)

现在,集合中的每个字符都有一个数字(代码点),因此我们知道我们在谈论什么(在许多集合中为65=“a”,但不一定是所有集合)。传统上,不同的国家/计算机公司为某些字符制定了自己的代码(在英国,“英镑”被认为很重要,而在美国则不太重要)。因此,我们需要知道在交换信息时要使用什么字符集

然而,当我们通过网络写入文件或发送消息时,我们会写入字节,字节只能容纳数字0-255。那么-我们如何处理代码点大于255的字符呢

我们需要一个编码。这是一组规则,说明如何将代码点转换为字节

Unicode是一个字符集,包含几乎所有使用过的书写符号(它们也不断添加到其中)。它有许多编码,也许最常见的是UTF-8。UTF-8编码对大于127的数字使用多个字节(谷歌,如果你关心原因的话)

ISO-8859-1是基于欧洲的字符集和编码(每个字符一个字节)。ISO-8859-15对其进行了修订,其中引入了“欧元”符号。在Unicode标准中,两者都只包含一小部分字符(没有阿拉伯文、中文、笑脸等)

如果不理解ISO-8859-1中的文件的含义,就无法区分ISO-8859-15中的文件和ISO-8859-1中的文件。在一种情况下,字节0xA4在另一种情况下表示“€”

有时可能会发现UTF-8文件,因为它对如何生成大型代码点有一定的规则

在您的情况下,这两个字符代表版权符号?它们是该字符的UTF-8编码。你大概是用ISO-8859或Windows之类的东西打的

下面是一个小脚本来说明我的意思。它以两种编码方式打印“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应该比大多数语言在这方面做得更好


附言-Unicode专家。是的,我意识到这过于简化了许多微妙的细节,但我想传达基本信息,而不是像链接文章那样让人害怕。

好的-你需要了解一些字符编码

有一种称为字符集的东西——它是一组命名的有效字符(“a”、“z”、“1”、“1”等)。perl字符串通常包含字符。Perl的字符集包括世界上的一切(甚至更多)

现在,集合中的每个字符都有一个数字(代码点),因此我们知道我们在谈论什么(在许多集合中为65=“a”,但不一定是所有集合)。传统上,不同的国家/计算机公司为某些字符制定了自己的代码(在英国,“英镑”被认为很重要,而在美国则不太重要)。因此,我们需要知道在交换信息时要使用什么字符集

然而,当我们通过网络写入文件或发送消息时,我们会写入字节,字节只能容纳数字0-255。那么-我们如何处理代码点大于255的字符呢

我们需要一个编码。这是一组规则,说明如何将代码点转换为字节

Unicode是一个字符集,包含几乎所有使用过的书写符号(它们也不断添加到其中)。它有许多编码,也许最常见的是UTF-8。UTF-8编码对大于127的数字使用多个字节(谷歌,如果你关心原因的话)

ISO-8859-1是基于欧洲的字符集和编码(每个字符一个字节)。ISO-8859-15对其进行了修订,其中引入了“欧元”符号。在Unicode标准中,两者都只包含一小部分字符(没有阿拉伯文、中文、笑脸等)

如果不理解ISO-8859-1中的文件的含义,就无法区分ISO-8859-15中的文件和ISO-8859-1中的文件。在一种情况下,字节0xA4在另一种情况下表示“€”

有时可能会发现UTF-8文件,因为它对如何生成大型代码点有一定的规则

在您的情况下,这两个字符代表版权符号?它们是该字符的UTF-8编码。你大概是用ISO-8859或Windows之类的东西打的

下面是一个小脚本来说明我的意思。它以两种编码方式打印“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应该比大多数语言在这方面做得更好


附言-Unicode专家。是的,我意识到这过于简化了许多微妙的细节,但我想传达基本信息,而不是像链接文章那样让人害怕。

问题是你是如何得到你所得到的:

在UTF-8中,
表示为两字节字符
A9 C2

在Windows代码页1250中,默认代码为p