我刚碰到同样的问题,发现上面的讨论很有用。正如你在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标志处于打开状态,则将其视为“普通”字符串。
您是否考虑过XML :: Compile?这是一段复杂的代码,但作者对于正确的支持一丝不苟。从我认识的那些使用过它的人那里,一旦你发现了这个东西,它会更好。我自己没有经验。 – 2012-02-21 01:25:26
上次我看着它,我无法理解如何使用它在第一个地方。我认为我缺乏必需的领域知识(写作XSD和其他)。 – Mithaldu 2012-02-22 11:19:49