Я только что столкнулся с той же проблемой и нашел обсуждение выше полезным. Как вы говорите в OP, проблема в том, что данные кодируются в base64, и флаг is_utf8 теряется. то, что происходит в serlializer, обрабатывает любую строку с не-ascii символом как двоичную. Я сделал это, чтобы сделать то, что я хотел, настроив сериализатор, как показано ниже. Это может иметь странные последствия, но это работает в моей ситуации ..
use strictures;
use Test::More;
use SOAP::Lite;
use utf8;
use Data::Dumper;
my $data = "mü\x{2013}";
my $ser = SOAP::Serializer->new;
$ser->typelookup->{trick_into_ignoring} = [9, \&utf8::is_utf8 ,'as_utf8_string'];
my $xml = $ser->envelope( freeform => $data );
my ( $cycled ) = values %{ SOAP::Deserializer->deserialize( $xml )->body };
is( length( $data ), length( $cycled ), "UTF-8 string is the same after serializing" );
done_testing;
sub check_utf8 {
my ($val) = @_;
return utf8::is_utf8($val);
}
package SOAP::Serializer;
sub as_utf8_string {
my $self = shift;
my($value, $name, $type, $attr) = @_;
return $self->as_string($value, $name, $type, $attr);
}
1;
9 означает, что проверка utf8 выполняется перед проверкой не-ascii символов. если флаг utf8 включен, он обрабатывает его как «нормальную» строку.