我們的一位客戶要求我們使用SOAP將一些事務信息發送到其API。需要一個字段被修剪到30個字符,所以我們我們mb_substr()
如下:PHP SoapClient中損壞的unicode字符
$params->Request->Description = mb_substr($title, 0, 30, 'UTF-8');
我們實例化SoapClient
對象如下:
$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個字節。
Sound of Contact - Möbius Slip
正在發送爲Sound of Contact - Möbius Slip
。 Call of Duty®: Ghosts Gold Edition
正在發送爲Call of Duty®: Ghosts Gold Edi
。我可以看到,我們在這裏有31個字符,這就是爲什麼遠程服務拒絕這個呼叫。如果標題小於31個字符,那麼即使字符被編碼弄亂了,它也可以正常工作。
我們知道$title
是可以的,因爲我們通過SOAP將這個(整個事物)發送到其他來源,沒有問題;它存儲在遠程系統中並顯示正確。這只是一個我們遇到問題的Web服務。實例化SoapClient
對象時我做錯了什麼?我錯誤地使用mb_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>
感謝