私はちょうど同じ問題にぶつかり、上記の議論が役に立ちました。 OPで言うように、問題は、データがbase64でエンコードされ、is_utf8フラグが失われるということです。 serlializerで何が起こるかは、非ASCII文字を持つ文字列をバイナリとして扱います。私は以下のようにシリアライザを調整することで、私が望むことをすることができました。 9がUTF8のチェックが非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;
...それは奇妙な結果をもたらす可能性が、それは私の状況で動作します。 utf8フラグがオンの場合、それは '通常の'文字列として扱われます。
あなたはXML :: Compileを考えましたか?これは複雑なコードですが、著者は正しいサポートのために細心の注意を払っています。私が知っている人から、それを使った人は、あなたがそれを見つけたら、この物の方がはるかに優れています。私はそれ自身で経験がありません。 –
最後に私はそれを見て、私は最初にそれを使う方法を理解できませんでした。私は必要なドメイン知識がないと思う(XSDなどを書いて)。 – Mithaldu