9

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");

但不是à我得到

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

4

2 回答 2

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,因为文档说Spreadsheet::ParseExcel::FmtJapan 格式化程序也支持 Unicode。如果您在使用默认格式化程序时遇到任何编码问题,请尝试使用它。

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

于 2013-10-01T12:25:08.083 回答
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,它会向你吠叫和/或输出更奇怪的垃圾。

于 2013-10-01T12:51:35.707 回答