Perl CSV 读取不存在的字符

Perl CSV reading characters that aren't there

我正在使用 Perl 的 Text::CSV_XS 包读取文件,我正在 Ubuntu:

open my $fh, '<:encoding(utf8)', 'file.csv' or die "Can't read csv: $!"; # error shows on this line
while (my $row = $list->getline ($fh)) {
....
}

这看起来很好,直到一行出现错误:

UTF-8 "\xE9" does not map to Unicode at 0.xlsx_to_json.pl line 198, <$_[...]> line 14019.

在线查看,这表明这是一个 ê 字符或类似的东西,这很奇怪,因为我在第 14109 行没有看到任何这样的字符,该行看起来就像任何其他行。

  1. 我试过将空行改为

    打开我的 $fh, '<', 'file.csv'

但这给出了同样的错误。

  1. 我尝试打开 CSV 文件并用不同的分隔符另存为 CSV,但在 Excel 2016 年我不能再这样做了,更改分隔符的选项根本就没有出现

  2. 我尝试在 LibreOffice 中打开以另存为 CSV,但更新删除了更改分隔符的功能

如何在没有这个奇怪错误的情况下读取此 CSV 文件?

您的文件不是有效的 UTF-8 文件。字节 E9 出现在不期望的位置。

后跟两个连续字节 = ok

$ perl -M5.010 -MEncode=decode -e'
   decode("UTF-8", "\xE9\xBF\xBF", Encode::FB_WARN | Encode::LEAVE_SRC);
   say "done";
'
done

后面没有两个连续字节 = 错误

$ perl -M5.010 -MEncode=decode -e'
   decode("UTF-8", "\xE9\x41", Encode::FB_WARN | Encode::LEAVE_SRC);
   say "done";
'
UTF-8 "\xE9" does not map to Unicode at -e line 2.
done

修复您的错误数据。