SOAP и русская кодировка

Slimm

Новичок
SOAP и русская кодировка

использую nusoap-php5-0.9
все работает
но проблема с кодировкой, ни как не могу передать на сервер читабельные данные
пробовал инициализировать строку символами в кодировке 1251 и в utf8 - отсылаются не читабельные данные
пробовал конвертировать
'comment' => iconv("CP1251", "UTF-8", $comment),

и все равно отсылается что-то типа такого:

POST /services/ishop HTTP/1.1
Host: mobw.ru
User-Agent: NuSOAP/0.7.2 (1.94)
Connection: close
Content-Type: text/xml; charset=UTF-8
SOAPAction: ""
Content-Length: 985


PHP:
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns9985:createBill xmlns:ns9985="http://tempuri.org"> <comment xsi:type="xsd:string">Пополнение счета пÑ&#8364;овайдеÑ&#8364;а</comment> </ns9985:createBill> </SOAP-ENV:Body></SOAP-ENV:Envelope>
при этом кодировка в браузере, который отображает сей запрос, стоит utf8

по всей вероятности nusoap сам конвертирует, как это можно было отключить или обойти ?
 

mity

Новичок
Пример инициализации взаимодействия с Яндекс Директ

http://direct.yandex.ru/docs/api.pdf
http://direct.yandex.ru/docs/api-faq.pdf стр 7

PHP:
require_once('nusoap073/lib/nusoap.php');
//Я использовал версию 
//$Id: nusoap.php,v 1.114 2007/11/06 15:17:46 snichol Exp $
//Первая что попалось



$proxyhost = '';
$proxyport = '';
$proxyusername = '';
$proxypassword = '';
$wsdlurl = "http://soap.direct.yandex.ru/api.wsdl";
$client = new nusoap_client($wsdlurl, 'wsdl', $proxyhost, $proxyport, 
$proxyusername, $proxypassword); $client->authtype = 'certificate';
$client->decode_utf8 = 0;
$client->soap_defencoding  = 'UTF-8';
Правда я передавать русские буквы на сервер не пробовал, небыло необходимости
но принимается всё нормально, в формате UTF-8
 

findnext

Новичок
iconv здесь конечно не поможет...

попробуй такой способ

PHP:
mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, Windows-1251', true));
 

Slimm

Новичок
наверно я дал много лишней информации,
давайте рассмотрим вопрос в таком ракурсе строка уже в utf8 (не важно как это получилось)

пытаюсь такую строку передать посредством nusoap :

$client = new soapclientnusoap("https://mobw.ru/services/ishop", false);
$client->useHTTPPersistentConnection();

// по рекомендации mity добавил:
$client->decode_utf8 = 0;
$client->soap_defencoding = 'UTF-8';

$params = array(
'comment' => $comment
);

$result = $client->call('createBill', $params);

echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';


Результат, тотже:
<comment xsi:type="xsd:string">Пополнение счета пÑ&#8364;овайдеÑ&#8364;а</comment>

Явно что nusoap конвертирует строку, но в какой кодировке ему ее давать, или как отключить эту конвертацию
 

Beavis

Banned
Slimm
у тебя нет доступа к исходникам nusoap'а что ли?
открываешь его и смотришь где эта строка преобразуется
 

mity

Новичок
Из приведенной строки видно, что идёт дополнительное конвертирование в формат UTF-8, возможно даже 2 раза
Скорее всего данные нужно передавать в формате “ISO-8859-1”, правда там нет русских букв.

Анализируйте debug_str, там больше информации

Для начала поставьте последний php 5.3.2

Cформируйте и отправить тестовую строку
PHP:
  $TestStr="";
  for($n=32;$n<256;$n++)
    $TestStr.=chr($n);
и посмотрите, какая при этом происходит перекодировка

Смотрите файл \nusoap-php5-0.9\lib\nusoap.php
строка 5840
исправьте
var $decode_utf8 = true;
на
var $decode_utf8 = false;

строка 5851
исправьте
function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
на
function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=false){

И снова отправьте тестовую строку и посмотрите изменился ли результат

Также можно заменить все упоминания ISO-8859-1 на UTF-8 или cp1251

Если дело уж совсем плохо, то можно конвертировать в формат &#1053;&#1072; &#1075;
Ну и в конце концов можно попробовать использовать другой NuSoap

Если случится чуди и всё заработает как надо
Замените
$GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 9;
на
$GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 0;

А то при работе будет отдаться очень много памяти.

-~{}~ 15.04.10 14:28:

Ну в общем глюченный NuSoap Вы используете

Попробуйте
"http://sourceforge.net/projects/nusoap/"

PHP:
<?php
header('Content-Type: text/html; charset=UTF-8');
@date_default_timezone_set(@date_default_timezone_get());//Чтобы php не ругался
include "nusoap.php";
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<?php

  $client = new nusoap_client("https://mobw.ru/services/ishop");
  $client->useHTTPPersistentConnection();   

  $client->decode_utf8 = 0;
  $client->soap_defencoding = 'UTF-8';
		
  $TestStr="Привет";
  $result = $client->call('createBill', array('comment' => $TestStr));
	
  echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';

?>
</body>
</html>
 

Slimm

Новичок
mity
БОЛЬШОЕ СПАСИБО!!!

действительно я использовал спец сборку в которой внесены изменения дабы не конфликтовать с soap расширением php5, похоже что наменяли лишнего ...

еще раз СПАСИБО, все заработало как надо
:)
 
Сверху