PHP SoapClient中的损坏unicode字符

PHP SoapClient中的损坏unicode字符,php,soap,unicode,utf-8,Php,Soap,Unicode,Utf 8,我们的一个客户要求我们使用SOAP向他们的API发送一些事务信息。其中一个字段需要修剪为30个字符,因此我们使用mb_substr()如下所示: $params->Request->Description = mb_substr($title, 0, 30, 'UTF-8'); $client = new SoapClient( $wsdlUri, array(

我们的一个客户要求我们使用SOAP向他们的API发送一些事务信息。其中一个字段需要修剪为30个字符,因此我们使用
mb_substr()
如下所示:

$params->Request->Description = mb_substr($title, 0, 30, 'UTF-8');
$client = new SoapClient(
                    $wsdlUri,
                    array(
                        'trace' => 1,
                        'exceptions' => true, 
                        'cache_wsdl' => WSDL_CACHE_NONE, 
                        'soap_version' => SOAP_1_2, 
                        'encoding' => 'UTF-8'
                    )
                );
我们将
SoapClient
对象实例化如下:

$params->Request->Description = mb_substr($title, 0, 30, 'UTF-8');
$client = new SoapClient(
                    $wsdlUri,
                    array(
                        'trace' => 1,
                        'exceptions' => true, 
                        'cache_wsdl' => WSDL_CACHE_NONE, 
                        'soap_version' => SOAP_1_2, 
                        'encoding' => 'UTF-8'
                    )
                );
我的理解是,这将告诉
SoapClient
,字符串将以UTF-8格式提供,并且当我们修剪到30个字符时,我们将其修剪为30个UTF-8字符,而不是30个字节

接触声-Möbius滑条
作为
接触声-MÃ∗bius滑条
发送<代码>使命召唤®:幽灵黄金版作为
使命召唤®:幽灵黄金Edi
发送。我可以看到这里有31个字符,这就是为什么远程服务拒绝呼叫。如果标题少于31个字符,则即使编码将字符弄乱,标题也可以正常使用

我们知道,
$title
是可以的,因为我们通过SOAP将这个(整个事情)发送到其他来源,没有问题;它存储在远程系统中并正确显示。这只是我们遇到问题的一个web服务。在实例化
SoapClient
对象时,我是否做错了什么?我是否错误地使用了
mb\u substr()
?还有什么我错过的吗

这是正在生成的XML的一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://ourclient/webservices/" xmlns:ns2="http://ourclient/webservices/method/" xmlns:ns3="http://www.w3.org/2005/08/addressing">
  <env:Header>
    <ns3:Action>http://ourclient/webservices/method/action</ns3:Action>
  </env:Header>
  <env:Body>
    <ns1:Method>
      <ns1:Request>
        <!-- CROPPED -->
        <ns1:Description>Call of Duty®: Ghosts Gold Edi</ns1:Description>
      </ns1:Request>
    </ns1:Method>
  </env:Body>
</env:Envelope>

http://ourclient/webservices/method/action
使命召唤:幽灵黄金Edi

谢谢

结果证明我们做的一切都是对的,但是我们遇到了字符串UTF-8字符的问题,其中字符串大于30字节,因为API拒绝了这些数据。在与服务提供商反复测试之后,我们最终确定问题实际上已经解决。他们告诉我们他们可以接受30个UTF-8字符,但实际上是30字节的UTF-8字符。解决方案实际上是使用
mbstrcut()
方法:

这将修剪到30个字节(就像一个简单的
substr()
那样),但如果在多字节字符中间修剪,它将返回到当前字符之前的位置,并且只返回完整字符