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

时间:2013-10-01 12:04:33

标签: perl excel

我使用Spreadsheet::ParseExcel解析Excel电子表格文件,如下所示

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

从这样的细胞中读取值

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

问题在于,当有法语字符时,例如à,它会显示ò

确保我使用的解析没有错误

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

因此,当我使用任何在线十六进制到字符串转换器时,我会得到à

我也试过

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

但不是à而是

有没有办法获得正确的角色?

2 个答案:

答案 0 :(得分:8)

尝试使用格式化程序解析文件,例如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,因为documentation says Spreadsheet :: ParseExcel :: FmtJapan格式化程序也支持Unicode。如果您遇到默认格式化程序的任何编码问题,请尝试相反。

*更新: 我自己在带有希腊字符的xls文件中尝试过,但它对FmtUnicode或FmtJapan都不起作用。然后我找到了这个perlmonks post,使用了提供的My::Excel::FmtUTF8模块,并在使用$cell->value()打印单元格的值时成功运行。

答案 1 :(得分:2)

我已经尝试了你描述的内容,这在我启用utf-8输出后正常工作。我猜你要么有一个奇怪的excel文件(你应该在某个地方发布一个例子),或者你的终端配置不当。

处理字符集问题很难,因为你的终端让我感到困惑。所以将输出管道输入'od -c'来查看你得到的东西总是一个好主意。在我的脚本中,我从我躺在的电子表格中获取此文本:

Value       = Descripción

当我通过od管道时:

0000000   V   a   l   u   e                               =       D   e
0000020   s   c   r   i   p   c   i 303 263   n  \n

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

iconv -f utf-8

如果输入不正确,utf-8它会咆哮你和/或输出甚至更怪异的垃圾。