【发布时间】:2016-10-11 20:51:20
【问题描述】:
我正在抓取网页,并从中提取特定部分。该部分包括引号(’,字符 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,没有效果。
我知道我的文本文件查看器可以显示逗号,因为我将一个逗号打印到一个测试文件并打开它。因此问题出在我的脚本中。
我做错了什么,我该如何解决?
更新:我可以使用$content =~ s/’/'/g 将其替换为一个简单的撇号,但我仍然不知道为什么其他方法都不起作用。我还想要一个真正解决问题的修复程序,而不仅仅是解决其中一个症状。
更新 2:hobbs 告知我该字符实际上是 U+2019 RIGHT SINGLE QUOTATION MARK,并将我的正则表达式更改为使用 chr 0x2019,现在可以使用了。
【问题讨论】:
-
无论您获取网页的内容如何,它都误解了编码 - 但您没有在问题中包含这部分代码。
-
我正在使用 LWP::Simple 的 get(URL) 方法。你会推荐什么?
-
你确定 反逗号 是 146 吗?我只是将它从您的 OP 复制并粘贴到我的编辑器中,保存它,执行
hexdump -C并得到e2 80 99。 -
@PerlDog 你是对的,我什至没有注意到。
-
这个字符:
’是右单引号,Unicode 0x2019。我见过术语“反逗号”用于指代某种引号,但它似乎并不常见(也许它是英国特有的?)。 Unicode 没有定义“倒置逗号”字符。并且 chr(146) 是 Unicode 中的控制字符(“PRIVATE USE TWO”)——尽管它是 Windows-1252 中的右单引号。