Perl 编码模块和倒逗号

Perl 编码模块和倒逗号,perl,encoding,utf-8,Perl,Encoding,Utf 8,我正在抓取一个网页,并从中提取一个特定的部分。该部分包括倒逗号(”,字符146)。我试图将提取的数据打印到一个文本文件中,但它给了我€™而不是倒逗号。我尝试了以下方法: use Data::Dumper; local $Data::Dumper::Useqq = 1; warn(Dumper($content)); utf8::decode($content) or die; $content=~s/'/'/g my$invComma=chr 146; $content=~s/$invCo

我正在抓取一个网页,并从中提取一个特定的部分。该部分包括倒逗号(
,字符146)。我试图将提取的数据打印到一个文本文件中,但它给了我
€™而不是倒逗号。我尝试了以下方法:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
warn(Dumper($content));
utf8::decode($content) or die;
  • $content=~s/'/'/g
  • my$invComma=chr 146;
    $content=~s/$invComma/'/g
  • $content=~s/\x{0092}/'/g
所有这些都不起作用。我不能
解码('UTF-8',$content)
,因为它有宽字符。当我尝试
encode('UTF-8',$content)
更改为
Ù取而代之。我也尝试过使用utf8,但没有效果

我知道我的文本文件查看器可以显示反逗号,因为我将一个反逗号打印到测试文件并打开了它。因此,问题在我的脚本中

我做错了什么?我该如何修复它

更新:我能做
$content=~s/s€™/'/g
用一个简单的撇号来代替它,但我仍然不知道为什么没有其他东西可以工作。我还想要一个解决问题的方法,而不是仅仅解决一个症状


更新2:我被告知该字符实际上是
U+2019右单引号
,并将我的正则表达式更改为使用
chr 0x2019
,现在可以使用。

您尝试替换的字符在Windows-1252编码中仅为0x92/146。Perl使用Unicode,其中该字符是
U+2019右单引号
,又称
“\x{2019}”
chr(0x2019)
,或
chr(8217)
,首先找出
$content
包含的内容。您可以使用以下选项:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
warn(Dumper($content));
utf8::decode($content) or die;

如果您得到以下信息,
$content
将被解码

$VAR1 = "...\x{2019}...";
以下任何一项都可以

use utf8;  # Source code is encoded using UTF-8.
$content =~ s/’/'/g;


如果您得到以下信息,
$content
将使用UTF-8进行编码

$VAR1 = "...\342\200\231...";
首先,使用以下任一方法解码
$content
的值:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
warn(Dumper($content));
utf8::decode($content) or die;

然后使用解码内容的任何解决方案(如上)


如果您得到以下信息,
$content
将使用cp1252进行编码

$VAR1 = "...\222...";
首先解码
$content
的值

use Encode qw( decode );
$content = decode("cp1252", $content);
然后使用解码内容的任何解决方案(如上)



顺便说一下,
E2 80 99
)的UTF-8编码如果解码为cp1252时的样子。

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

无论您如何获取网页内容,这都是对编码的错误解释­-但您的问题中没有包含这部分代码。我使用的是LWP::Simple的get(URL)方法。你会推荐什么呢?你确定倒逗号是146吗?我只是从你的OP中复制并粘贴到我的编辑器中,保存了它,做了
hextump-C
,得到了
e28099
@PerlDog没错,我甚至没有注意到。这个字符:
是右单引号,Unicode 0x2019。我见过术语“倒逗号”用来指某种引号,但它似乎不是常见用法(可能是英国特有的?)。没有Unicode定义的“倒逗号”字符。chr(146)是Unicode中的一个控制字符(“专用二号”)——尽管它在中是正确的单引号。所以我应该在网上寻找合适的Unicode代码点,并以这种方式进行替换?我可以在输入端使用编码模块吗?如果是,怎么做?@Lilith您不需要编码模块,您的输入已经被LWP正确解码(使用编码模块)。LWP::Simple使用HTTP::Response的
解码内容
方法。那么如何使脚本正确打印它呢?我使用IO::All将输出文件标记为utf8,然后直接打印输出。它显示为“一欧元”™" 相反,我可以为这三个字符添加替换项(打开/关闭双引号和右单引号),但我宁愿解决问题,也不愿解决症状。@Lilith在《什么》中就是这样出现的?你是在用不支持unicode的东西打开输出文件吗?还是在做其他愚弄编码检测的事情?真的很难说,问题不在你想的地方。我在Windows上使用gVim,我想就是这样?