使用Perl从Excel电子表格中读取法文字符

我正在使用Spreadsheet::ParseExcel来parsingExcel电子表格文件,如下所示

 my $FileName = "../excel.xls"; my $parser = Spreadsheet::ParseExcel->new(); my $workbook = $parser->parse($FileName); 

并从这样的细胞读取值

 $product = $worksheeto->get_cell( $row, 0 )->value(); 

问题是,当有一个法国字符,例如à ,它显示ò

为了确保在我使用的parsing中没有错误

 print unpack('H*', $product) . "\n"; 

所以,当我使用任何在线hexstring转换器我得到的à

我也试过了

 use utf8; binmode(STDOUT, ":utf8"); 

但不是我得到

有没有办法获得正确的字符?

尝试使用格式化程序parsing文件,例如Spreadsheet :: ParseExcel :: FmtUnicode :

 use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtUnicode; #use Spreadsheet::ParseExcel::FmtJapan; my $FileName = '../excel.xls'; my $parser = Spreadsheet::ParseExcel->new(); my $formatter = Spreadsheet::ParseExcel::FmtUnicode->new(); my $workbook = $parser->parse($FileName,$formatter); 

试试FmtJapan,因为文档说 : Spreadsheet :: ParseExcel :: FmtJapan格式化程序也支持Unicode。 如果遇到默认格式化程序的任何编码问题,请尝试使用。

*更新:我自己在希腊字符的xls文件中尝试过,但它没有与FmtUnicode或FmtJapan都没有工作。 然后,我发现这个perlmonks后 ,使用提供的My::Excel::FmtUTF8模块,并成功地打印单元格的值$cell->value()

我已经尝试过你所描述的,并且这个工作正常,一旦启用utf-8输出。 我猜你要么有一个奇怪的Excel文件(你应该发布一个例子),或者你的terminalconfiguration不好。

处理字符集问题很难,因为你的terminal可以让我困惑。 因此,将输出传输到“od -c”以查看所获得的结果总是一个好主意。 在我的脚本中,我从躺在电子表格中的文本中获取这些文本:

 Value = Descripción 

当我通过odpipe道:

 0000000 V alue = D e 0000020 scripci 303 263 n \n 

我可以看到ó是两个字节长,这表明是UTF-8。 为了确保,你可以要求iconv从预期的输出字符集转换成你在terminal中使用的任何字符集:

 iconv -f utf-8 

如果input是不正确的UTF-8它会吠叫你和/或输出甚至怪异的垃圾。