php soap客户端中的特殊字符问题

时间:2009-08-28 13:36:37

标签: php soap encoding character-encoding

我遇到与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&ouml;m</lastName>
     </Contact>
    </ns1:content>
   </ns1:Response>
  </ns1:callFunctionResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

谢谢!

6 个答案:

答案 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('&', '&amp;', $request); // or whatever
        ob_end_flush();
        ob_start();
        $result = parent::handle($request);
        ob_flush();
        return $result;     
    }
}