【问题标题】:Problems with special characters in php soap clientphp soap客户端中特殊字符的问题
【发布时间】:2009-08-28 13:36:37
【问题描述】:

我有一个与this question 相关的问题。我有一个返回一些名称的 Web 服务(也使用 php)。当它们中的任何一个包含瑞典字符(å、ä 或 ö)并且可能还有其他字符时,我会得到一个肥皂错误(看起来我们没有 XML 文档)。但是,我可以使用 $soapcalo->__getLastResponse() 查看完整(正确的 afaik)响应。

如何处理特殊字符?我尝试在客户端和服务器上添加编码属性(utf-8)但没有成功。

编辑:soap 回复的摘录:

<?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>

谢谢!

【问题讨论】:

  • 你能给我们第一行的 SOAP 响应吗?由于 SOAP 是 XML,一旦您在服务器上正确添加了 UTF-8,响应 XML 应该会告诉您它是 UTF-8。如果 XML 确实声称是 ISO-8859-1 但实际上包含 UTF-8,那么您就会遇到问题。

标签: php soap encoding character-encoding


【解决方案1】:

只是一个疯狂的猜测:您确定名称实际上是 utf-8 编码的吗?我认为仅设置 SOAP 属性将改变值的实际编码。在通过 SOAP 返回名称之前,您是否尝试过在名称上使用 utf8_encode

【讨论】:

  • 我现在有 :) 不幸的是,它没有任何区别,而且服务器端日志记录(基本到文本文件)无论如何都以 utf-8 格式出现,所以一切看起来都很好。谢谢
【解决方案2】:

好的,大家 - 问题终于解决了,我想我会把它贴在这里给其他有类似问题的人。事实证明,问题出现在这个过程的早期。

SOAP 回复的内容是使用 DomDocument 构建结构生成的。后来用 saveHTML 函数保存了。事实证明,该函数添加了一些 HTML 编码,这会破坏客户端上的 soap 解码。

当改为使用 saveXML 函数时,回复成功通过(添加标签和其他奇怪的东西时也是如此),并且还被soap客户端解码为正确的字符串。

我希望这是结束,但你永远不知道:)

感谢所有帮助以及对那些有助于检查正确位置的人 +1。

/维克多

【讨论】:

  • 您好,我不太清楚您是如何解决这个问题的。因为我正面临着确切的问题。请您发布一些详细的代码吗?
  • 对我来说,saveHTML 添加了额外的编码,破坏了肥皂编码,当我更改为 saveXML 时,我得到了“原始”编码,然后可以正确处理。还要检查其他回复,可能对您的情况有所帮助。
【解决方案3】:

不确定这是否会有所帮助,但不妨看看HTML entities

【讨论】:

  • 谢谢。我想可以将所有 å、ä 和 ö 编码为 å ä和 ö分别,但这真的不应该是必要的。
  • 编辑到上面:结果是 å etc编码实际上是首先破坏解码的原因!皂洗时不要这样做! :)
【解决方案4】:

因为我在谷歌搜索“SoapClient 无法正确解码 utf8 数据”时将这个问题作为第一个结果

我的问题是,从管道 UTF-8 编码的特殊字符和 php SoapClient 无法正确解码它们。

通过将我的课程中的 php 文件的编码更改为 UTF-8 来解决此问题。

【讨论】:

    【解决方案5】:

    SOAP 服务器是基于 Windows 的服务器吗?我注意到有时基于 Windows 的服务器或应用程序不会发送 UTF-8,而是发送 cp1252

    在一个应用程序中,我的编码中有特殊字符,我只需在我的 HTML 输出上运行以下代码:

    <?php
    print htmlentities($string, ENT_COMPAT, 'cp1252');
    

    确保对任何特殊字符进行编码以用于 HTML 输出。

    【讨论】:

    • 我并没有真正关注你...问题是我只能访问通过 __getLastResponse() 返回的真实数据 - 通常访问它只会得到 SOAP 错误。但要回答这个问题 - 是的,soap 服务器在 Windows 机器上运行。
    【解决方案6】:

    这些解决方案都不适合我。我结束了对 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;     
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多