【发布时间】:2019-06-06 23:24:37
【问题描述】:
我正在尝试从文件的第一部分读取行,该文件包含以cp1252 编码的文本标头,并在特定关键字之后包含二进制数据。
问题
Perl 警告我从未读过的部分文件中的无效编码。我在两个文件中创建了一个示例来演示该问题。
linebug.pl的内容:
#!/usr/bin/perl
use 5.028;
use strict;
use warnings;
open( my $fh, "<:encoding(cp1252)", "testfile" );
while( <$fh> ) {
print;
last if /Last/;
}
testfile 的 Hexdump,其中在文本 Wrong 之后的字节 0x81 是故意添加的,因为它不是有效的 cp1252 代码点:
46 69 72 73 74 0a |First.|
4c 61 73 74 0a |Last.|
42 75 66 66 65 72 0a |Buffer.|
57 72 6f 6e 67 81 0a |Wrong..|
第三行 Buffer 只是为了表明我没有读得太远。这是我读到的最后一行和“二进制”数据之间的有效行。
这是显示我只读过两行的输出,但 perl 仍然发出警告:
user@host$ perl linebug.pl
cp1252 "\x81" does not map to Unicode at ./linebug.pl line 6.
First
Last
user@host$
可以看出,我的程序读取并打印了前两行,然后退出。它不应该尝试阅读和解释其他任何内容,但我仍然收到关于 \x81 未映射到 Unicode 的警告。
问题
- 为什么会发出警告?我没有读这条线。预感告诉我它正在尝试提前读取,但为什么要尝试解码?
- 是否有解决方法或更好的方法来处理编码从一个部分更改为另一个部分的文件?
我仍然希望在读取初始行时发出警告,以防文件损坏。
【问题讨论】:
-
大概是在从文件读取到内部缓冲区时进行编码转换,而不是在数据实际从该缓冲区返回到程序时进行编码转换。
标签: perl file-io character-encoding