提问人:PaulM 提问时间:5/3/2022 更新时间:5/3/2022 访问量:243
UTF8 在使用 Archive::Zip 时导致错误
UTF8 is causing error when using Archive::Zip
问:
#!/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 行
答:
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_utf8
utf8::encode
评论