0

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

我需要

$a=©;

但我得到了这样的

$a =©

请给我解决方案

4

3 回答 3

5

好的 - 你需要了解一些关于字符编码的知识。

有一种叫做字符集的东西——它是一组命名的有效字符(“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 专家。是的,我意识到这过度简化了很多繁琐的细节,但我想传达基本知识,而不是像链接的帖子那样可怕。

于 2013-10-15T12:08:12.657 回答
1

一个问题是你如何得到你得到的:

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

在 Windows 代码页 1250(美国的默认代码页)中,A9 C2代表两个字符:©.

你没有说你是怎么做的或做了什么。您是否在 as 中键入了变量$a = "©",但它显示为$a = "Ä©",或者您在一个地方键入了 Perl 脚本,但它在其他地方显示为错误的变量。或者,如果您正在运行 Perl 脚本,输入©作为输入,但Ä©作为输出。

我不会重复Richard Huxton 的解释,但您确实需要了解字符是如何表示的。

于 2013-10-15T14:59:46.823 回答
0

上下文是什么?如果您将其打印到控制台,其他评论员是正确的,您需要使用正确的编码,然后$a="©";就可以了。如果您正在写入网页,使用它可能更明智,$a="©"因此浏览器将正确解释它。

于 2013-10-15T17:04:48.250 回答