1

我在 Perl 中有一个带有 POE 的 Web 服务器。在数据到达线路之前,头部和正文在 POE::Filter::HTTPD->put 中连接。出于某种奇怪的原因,一些标头被提升为 utf-8,这意味着二进制正文正在损坏。

问题是 headers_as_strings() 中的连接正在将某些标头升级到 UTF-8,即使它不应该。例如,如果我添加以下代码,则只有最后一行会产生警告。因此,连接 3 个非 utf8 字符串会生成 UTF-8 字符串,但并非针对所有标题。解决方案是 utf8::downgrade on $ret[-1] 但我想知道为什么会这样

my $vnl = _process_newline( $value, $endl );
warn "$$: '$name' is utf8" if utf8::is_utf8( $name );
warn "$$: '$sep' is utf8" if utf8::is_utf8( $sep );
warn "$$: '$vnl' is utf8" if utf8::is_utf8( $vnl );
push @ret, join $sep, $name, $vnl;
# only this last line produces a warning
warn "$$: the join has utf8 " if utf8::is_utf8( $ret[-1] );
4

1 回答 1

2

简短的回答是 Perl 会在没有警告的情况下将字符串升级为 utf-8。我正在使用我认为是字符串的 MIME::Type 对象。MIME::Types 使用打开的 DB '<:encoding(utf8)' 打开它的 DB。

但真正的 WTF 是 POE::Driver::SysRW->flush 有使用字节;在 syswrite() 之前,那是数据变得混乱的时候。

于 2020-09-01T20:57:09.050 回答