Perl中的波兰字符[HTML::TreeBuilder和utf8输入文件]

3

我已经在这个问题上工作了一个星期,但仍然找不到可行的解决方案。我解析的HTML文件包含用UTF-8编码的波兰字母。在提取我感兴趣的信息后,我将它们保存到文件或打印到控制台,但所有的波兰字符都无法正确显示。

我尝试使用Stack Overflow和其他论坛上的所有方法,但是对其他人有效的方法出现了某些问题,对我不起作用。 我使用了以下方法:

use open qw(:std :utf8);
use HTML::TreeBuilder qw( );
use Object::Destroyer qw( );
#and many others;

这是我的 Perl 代码:

use strict;
use warnings;
use feature 'say';
use HTML::TreeBuilder;
use File::Find;
use Encode;


my $location="C:\\MyLocation";
open (MYFILE, '>>data.txt');

sub find_txt {    

    my $F = $File::Find::name;

    if ($F =~ /index.html$/ ) {

       my $tr = HTML::TreeBuilder->new->parse_file('index.html');


        for my $div ($tr->look_down(_tag => 'h2', 'class' => 'featured')) {
           say $div->as_text;   
           print (MYFILE $div->as_text);
        }   

    for my $div ($tr->look_down(_tag => 'div', 'class' => 'post-content')) {
        for my $t ($div->look_down(_tag => 'p')) {
            say $t->as_text;
            print (MYFILE $t->as_text);
        }
    }       

    for my $div ($tr->look_down(_tag => 'h4', 'class' => 'related-posts')) {
        for my $t ($div->look_down(_tag => 'a')) {
            say $t->as_text;
            print (MYFILE $t->as_text);
        }
    }

}


}

find(\&find_txt, $location);
close (MYFILE);

这是导致问题的HTML文件片段:

<div class="post-content">
  <p>(łac. abacus)</p>
  <p>1. płyta będąca najwyższą częścią kolumny</p>
  <p>2. w starożytności &#8211; deska do liczenia, pierwowzór liczydła</p>

我不确定您的浏览器是否能够显示波兰字符,但是它们被Unicode编码为104、106、118、141、143、D3、15A、179、17B、105、107、119、142、144、F3、15B、17A和17C。


你需要使用use open qw(:std :utf8),你说你已经尝试过了。你是如何查看程序的输出结果的?如果你是在Windows的cmd控制台上显示它,那么可能设置的代码页不正确。输入chcp 65001以将其设置为UTF-8。 - Borodin
我将输出显示在控制台上,并将输出保存到文件中。无论是在控制台还是文件中,结果都是相同的。 - Lenny
1个回答

3

HTML::TreeBuilder解析文件-字符集自动检测

您可以明确地打开具有指定字符集的文件。

...
open (my $MYFILE, '>>:utf8','index.html'); # explicitly open MYFILE with utf8 charset
...
my $tr = HTML::TreeBuilder->new->parse_file($MYFILE);
...

或者使用IO::HTML自动检测打开文件的字符集。

...
use IO::HTML;                 # exports html_file by default
...
my $tr = HTML::TreeBuilder->new->parse_file(html_file('index.html'));
....

man HTML::TreeBuilder

parse_file
   ....
   When you pass a filename to "parse_file", HTML::Parser opens it in binary mode,
   which means it's interpreted as Latin-1 (ISO-8859-1).  If the file
   is in another encoding, like UTF-8 or UTF-16, this will not do the right thing.
....
SEE ALSO
   ....
   For opening a HTML file with automatic charset detection: IO::HTML.

2
下一个重要版本的HTML::TreeBuilder将自动使用IO::HTML。您可以通过测试试用版本来提供帮助。 - cjm
使用IO::HTML;没有任何区别。我将尝试使用试用版本。 - Lenny
使用use utf8;binmode(STDOUT,':utf8');open (MYFILE, '>>:utf8','data.txt');来检查 - 这种混合修复了我的计算机上的问题。否则报告如果say('ąćę')打印/显示正确的字符。 - AnFi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接