我遇到与this question相关的问题。我有一个Web服务(也使用PHP)返回一些名称。当它们中的任何一个包含瑞典字符(å,ä或ö)时,可能还有其他字符我得到一个soapfault(看起来我们没有XML文档)。然而,我可以使用$ soapcalo-> __ getLastResponse()看到完整的(正确的afaik)响应。
如何处理特殊字符?我尝试在客户端和服务器上添加编码属性(utf-8),但没有成功。
编辑:肥皂回复的摘录:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="...">
<SOAP-ENV:Body>
<ns1:callFunctionResponse>
<ns1:Response>
<ns1:result>success</ns1:result>
<ns1:content>
<Contact>
<userName>VIB09SLA9EP</userName>
<firstName>Patrik</firstName>
<lastName>Stenström</lastName>
</Contact>
</ns1:content>
</ns1:Response>
</ns1:callFunctionResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
谢谢!
答案 0 :(得分:4)
只是一个疯狂的猜测:你确定名称实际是 utf-8编码?我认为只设置SOAP属性将不会改变值的实际编码。在通过SOAP返回名称之前,您是否尝试在名称上使用utf8_encode?
答案 1 :(得分:3)
好的每个人 - 问题终于解决了,以为我会在这里发布给其他有类似问题的人。事实证明,问题发生在这个过程的早期。
生成SOAP回复的内容是使用DomDocument构建结构的。后来用saveHTML函数保存了。事实证明,该功能增加了一些HTML编码,打破了客户端上的SOAP解码。
当使用saveXML函数时,回复成功通过(当添加标签和其他奇怪的东西时),并且也被soap客户端解码为正确的字符串。
我希望这是结束,但你永远不会知道:)
感谢所有帮助和+1对那些有助于检查正确位置的人。
/维克多
答案 2 :(得分:2)
不确定这是否有帮助,但可以查看HTML entities?
答案 3 :(得分:1)
因为我在google搜索“SoapClient无法正确解码utf8数据”时将此问题作为第一个结果点击了
我的问题是,管道UTF-8编码和php SoapClient的特殊字符没有正确解码它们。
通过更改我的类为UTF-8的php文件的编码来修复它。
答案 4 :(得分:0)
SOAP服务器是基于Windows的服务器吗?我注意到有些时候基于Windows的服务器或应用程序不会发送UTF-8
,而是发送cp1252
。
在一个应用程序中,我在该编码中出现了特殊字符,我只需在HTML输出上运行以下代码:
<?php
print htmlentities($string, ENT_COMPAT, 'cp1252');
确保为HTML输出编码任何特殊字符。
答案 5 :(得分:0)
这些解决方案都不适合我。我结束了 SoapServer 的重载,如下所述:
http://blog.mayflower.de/179-Extending-class-SoapServer-PHP5-for-debugging.html
并在重载的句柄函数中进行字符串替换。
class OverloadedSoapServer extends SoapServer
{
public function __construct ( $wsdl, $options = null )
{
return parent::__construct ( $wsdl, $options ) ;
}
public function handle($request = null) {
$request = str_replace('&', '&', $request); // or whatever
ob_end_flush();
ob_start();
$result = parent::handle($request);
ob_flush();
return $result;
}
}