【问题标题】:Perl CSV reading characters that aren't therePerl CSV 读取不存在的字符
【发布时间】:2021-09-23 20:05:10
【问题描述】:

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

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, '

但这给出了同样的错误。

  1. 我尝试打开 CSV 并使用不同的分隔符另存为 CSV,但我不能再在 Excel 2016 中执行此操作,更改分隔符的选项根本不会出现

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

如何读取这个 CSV 文件而不出现这个奇怪的错误?

【问题讨论】:

  • Re "这表明这是一个ê字符",不,这根本不是暗示。 ê 使用 UTF-8 编码是 C3 AA,但是文件中的 E9 有问题

标签: csv perl utf-8


【解决方案1】:

您的文件不是有效的 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

修复不良数据。

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2014-05-09
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2012-01-24
    • 2021-01-02
    • 2021-10-23
    • 2011-06-22
    相关资源
    最近更新 更多