UTF8 在使用 Archive::Zip 时导致错误

UTF8 is causing error when using Archive::Zip

提问人:PaulM 提问时间:5/3/2022 更新时间:5/3/2022 访问量:243

问:

#!/usr/bin/env perl
use utf8; #this causes error
use strict;
use warnings;

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

my $zip = Archive::Zip->new();

my $my_string_with_utf8 = <<'END_UTF8_STRING';
Text with UTF8 open/close 201c/201d “hello”
END_UTF8_STRING

my $zip_pathname = 'myfiles/myfile.txt';
$zip->addString($my_string_with_utf8, $zip_pathname);
unless ( $zip->writeToFileNamed('myZip.zip') == AZ_OK ) {
   die 'write error';
}

错误: Compress::Raw::Zlib::crc32 中的宽字符

为什么 utf8 会导致这些包中的错误? perl5/vendor_perl/Archive/Zip.pm 第 303 行

Perl UTF-8

评论


答:

1赞 ikegami 5/3/2022 #1

$my_string_with_utf8顾名思义,不使用 UTF-8 进行编码。它是一串解码文本,又名一串 Unicode 码位。

文件只能包含字节,因此您需要将这些代码点编码为字节,例如使用 UTF-8 等字符编码。

评论

0赞 PaulM 5/3/2022
删除使用 utf8 解决了错误,为什么?有什么变化?
0赞 ikegami 5/3/2022
向后“修复”。如果没有 ,Perl 希望源代码使用 ASCII 进行编码,但字符串文本是“8 位干净”,因此您最终会得到一个与源代码编码相同的字符串。但同样,这是倒退的。你不应该删除 ;您应该按照答案中提到的字符串进行编码。如果你想要 UTF-8,你可以使用 Encode 或内置的use utf8;use utf8;encode_utf8utf8::encode