如何将 utf8 字符串编写为二进制文件

How to write a utf8 string as binary

提问人:shirha 提问时间:3/18/2023 最后编辑:shirha 更新时间:3/19/2023 访问量:100

问:

我有一个已双重编码为 utf8 的 epub。我想通过解码一次并将其编写为二进制文件来修复它,但我收到“子例程中的宽字符”错误。我正在使用 Mojo::File。

use Mojo::Base -strict;
use Mojo::File;
use Encode qw( decode_utf8 encode_utf8 );

my $in = Mojo::File->new('part0000.html')->slurp();
my $out = decode_utf8($in);
utf8::downgrade($out);
Mojo::File->new('string.html')->spurt($out);

如果我尝试这样做,我会得到同样的错误。

my $in = Mojo::File->new('part0000.html')->slurp();
my $out = encode_utf8(decode_utf8(decode_utf8($in)));
Mojo::File->new('string.htm')->spurt($out);

解码似乎有效,但我不知道如何将其写成二进制。
任何建议都值得赞赏。部分0000.html

perl utf-8 魔力

评论

0赞 mob 3/18/2023
utf8 编码的字符串已表示为八位字节。您可以在不解码的情况下编写它。
0赞 ikegami 3/18/2023
您的两种解决方案都有效(尽管降级毫无用处)。
0赞 ikegami 3/18/2023
回复“我得到”子例程中的宽字符“错误”,那么您的文件没有像您声称的那样进行双重编码。
0赞 Mark Tolonen 3/18/2023
仅供参考,在 Python 中,它是 ,其中是系统区域设置(在我的系统上),但传递未定义的字节(与 )。不太了解 perl,无法回答。open('part0000.html', encoding='utf8').read().encode('ansi').decode('utf8')ansicp1252cp1252
0赞 ikegami 3/19/2023
仍在等待问题的演示......

答:

-1赞 shirha 3/19/2023 #1

显然,由于“宽字符”,不可能简单地在 Perl 中将 utf8 字符串编写为二进制文件。我用正则表达式以不同的方式解决了它。

评论

0赞 ikegami 3/19/2023
废话。该消息意味着您正在尝试将不是字节的内容写入文件,但文件只能包含字节。是不可能的。但这不是“将 utf8 字符串写成二进制”。这是完全可能的。