无法解释地将字符串升级为utf-8

时间:2020-09-01 19:36:57

标签: perl http unicode utf-8 poe

我在带有POE的Perl中有一个Web服务器。在数据连接之前,标头和正文在POE :: Filter :: HTTPD-> put中连接在一起。由于某些原因,某些标头被提升为utf-8,这意味着二进制主体已损坏。

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

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] );

1 个答案:

答案 0 :(得分:2)

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

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