我正在抓取网页,并从中提取特定部分。该部分包括引号(’
,字符146)。我正在尝试将提取的数据打印到文本文件中,但它会给我’
而不是反转的逗号。我尝试过以下方法:
$content =~ s/’/'/g;
my $invComma = chr 146;
$content =~ s/$invComma/'/g;
$content =~ s/\x{0092}/'/g;
它都没有奏效。我不能decode('UTF-8', $content)
,因为它有广泛的字符。当我尝试encode('UTF-8', $content)
’
更改为’
时。我已经尝试了use utf8
,但没效果。
我知道我的文本文件查看器可以显示引号,因为我将一个打印到测试文件并打开它。因此问题出在我的剧本中。
我做错了什么,我该如何解决?
UPDATE :我能够$content =~ s/’/'/g
用简单的撇号替换它,但我仍然不知道为什么没有其他工作。我也想要一个能够解决问题的解决方案,而不仅仅是解决其中一个症状。
更新2 :hobbs已通知我该字符实际为U+2019 RIGHT SINGLE QUOTATION MARK
,并将我的正则表达式更改为使用现在有效的chr 0x2019
。
答案 0 :(得分:5)
您尝试替换的字符在Windows-1252编码中仅为0x92 / 146。 Perl使用Unicode,其中该字符为U+2019 RIGHT SINGLE QUOTATION MARK
,即"\x{2019}"
,chr(0x2019)
或chr(8217)
。
答案 1 :(得分:4)
首先找出$content
包含的内容。您可以使用以下内容:
use Data::Dumper;
local $Data::Dumper::Useqq = 1;
warn(Dumper($content));
如果您收到以下信息,则$content
已解码
$VAR1 = "...\x{2019}...";
以下任何一项都有效。
use utf8; # Source code is encoded using UTF-8.
$content =~ s/’/'/g;
$content =~ s/\x{2019}/'/g;
$content =~ s/\N{U+2019}/'/g;
$content =~ s/\N{RIGHT SINGLE QUOTATION MARK}/'/g;
如果您得到以下内容,则使用UTF-8编码$content
。
$VAR1 = "...\342\200\231...";
首先使用以下任一方法解码$content
的值:
utf8::decode($content) or die;
use Encode qw( decode_utf8 );
$content = decode_utf8($content);
然后使用解码内容的任何解决方案(上图)。
如果您得到以下内容,则使用cp1252对$content
进行编码。
$VAR1 = "...\222...";
首先解码$content
。
use Encode qw( decode );
$content = decode("cp1252", $content);
然后使用解码内容的任何解决方案(上图)。
顺便说一下,’
是’
(E2 80 99
)的UTF-8编码在解码为cp1252时的样子。
答案 2 :(得分:1)