我使用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");
但不是à
而是+á
有没有办法获得正确的角色?
答案 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它会咆哮你和/或输出甚至更怪异的垃圾。