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,我想就是这样?