编码模块和引号

时间:2016-06-10 19:27:08

标签: perl encoding utf-8

我正在抓取网页,并从中提取特定部分。该部分包括引号(,字符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

3 个答案:

答案 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)

问题出现在我的脚本中,它出现在我的编辑器中。该脚本正常工作,问题是基于错误的借口。我在Windows上使用gVim,它与Unicode不能很好地兼容。我的脚本正在解码内容,但是当我在gVim中打开输出文件时,它会破坏文本并显示错误。我尝试使用正则表达式来更改字符失败,因为我使用了错误的代码点 - 它不是0x92,它是0x2019。这是gVim的另一个失败。感谢hobbsikegami帮助我解决这个问题。