PHP SoapClient中的损坏unicode字符
我们的一个客户要求我们使用SOAP向他们的API发送一些事务信息。其中一个字段需要修剪为30个字符,因此我们使用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(
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()
那样),但如果在多字节字符中间修剪,它将返回到当前字符之前的位置,并且只返回完整字符