WebMoney-кофейня
Наша группа ВКонтакте. Получай бонусы просто так!Топик в форуме: Рейтинги или с чем их едят
Поставить музыку в Кофейне:
Louis Armstrong - Go down, Moses
  ОтветитьНовая тема

> Ошибка кодировки в Х1
anton1251
Post #1 (Отправлено: 29.09.2014 08:32)     Быстрое цитирование
Цитировать


Завсегдатай кофейни
**

Сообщений: 24
Регистрация: 16.07.2014
Приветствую! victory.gif

Делаю всё, как описано тут http://owebmoney.ru/articles/xml3.shtml#1 но при выставлении счёта приходит в "каракулях" (Тестовый счёт).
Оба файла (test.php и wmxml.inc.php) в UTF-8 без BOM.
В чём может быть ошибка?
Версия PHP 5.4.

Мои подозрения в том, что он не преобразовывает символы из одной кодировки в другую, а в тупую меняет их. Я проделывал трюк в notepad++ и в "Кодировки" выбирал не "Преобразовать в ANSI", а "Кодировать в ANSI" и получил точно такой результат.


Написать приватное сообщениеНаписать по email
Niksen
Post #2 (Отправлено: 29.09.2014 10:38)     Быстрое цитирование
Цитировать


Главный кофейщик
*******

Сообщений: 1592
Регистрация: 7.01.2005
Откуда: Киев
Участник WM-Клуба # 1
Передавайте параметры в Win1251


==================
Написать приватное сообщениеНаписать по emailВебсайт
anton1251
Post #3 (Отправлено: 29.09.2014 15:47)     Быстрое цитирование
Цитировать


Завсегдатай кофейни
**

Сообщений: 24
Регистрация: 16.07.2014
Niksen сказал
Передавайте параметры в Win1251

Взято из http://owebmoney.ru/articles/xml3.shtml#1
Насколько я понимаю, что-то с
$desc=iconv("CP1251", "UTF-8", $desc);

С другой стороны, тогда бы ошибку выдавало, если бы неверно кодировалось это
$address=iconv("CP1251", "UTF-8", $address);

Всё сделал согласно описанию, но ошибка остаётся. sad.gif


Написать приватное сообщениеНаписать по email
anton1251
Post #4 (Отправлено: 29.09.2014 16:41)     Быстрое цитирование
Цитировать


Завсегдатай кофейни
**

Сообщений: 24
Регистрация: 16.07.2014
Но мне не понятно вот что.
Согласно документации по функции iconv:

iconv — Преобразование строки в требуемую кодировку
Описание
string iconv ( string $in_charset , string $out_charset , string $str )
Преобразует набор символов строки str из кодировки in_charset в out_charset.

Ведь написано из кодировки in_charset в out_charset. Почему же мы делаем преобразование из CP1251 в UTF-8? unsure.gif
Вот пример кода:
$desc=iconv("CP1251", "UTF-8", $desc);
источник

Это сообщение отредактировал anton1251 - 29.09.2014 16:42


Написать приватное сообщениеНаписать по email
Niksen
Post #5 (Отправлено: 30.09.2014 00:27)     Быстрое цитирование
Цитировать


Главный кофейщик
*******

Сообщений: 1592
Регистрация: 7.01.2005
Откуда: Киев
Участник WM-Клуба # 1
А, верно. В UTF надо desc на сервер ВМ передавать. Так а в какой кодировке у вас этот параметр передается в функцию. Если уже в UTF он туда попадает, то iconv не надо использовать.

И вот еще обратите внимание и попробуйте:

Можно даже преобразовать не в UTF-8, а в html-сущности, это тоже сработает:
$address=mb_convert_encoding($address, "HTML-ENTITIES","windows-1251"); $desc=mb_convert_encoding($desc, "HTML-ENTITIES","windows-1251");

Если же iconv и mbstring вашим сервером не поддерживаются, то могу предложить ещё один вариант. Оставьте $desc и $address в кодировке Win1251, а в начале XML-запроса вставляйте заголовок <?xml version='1.0' encoding='windows-1251'?>. Он укажет, что данные в пакете переданы в Win1251, и сервер WebMoney обработает их именно в этой кодировке. То есть пакет в этом случае будет начинаться так:

$xml="<?xml version='1.0' encoding='windows-1251'?>
<w3s.request>
...

Понятно, что если переменные $desc и $address были переданы в функцию _WMXML1(), уже пребывая в кодировке UTF-8, то никаких преобразований на этом этапе делать не нужно.


==================
Написать приватное сообщениеНаписать по emailВебсайт
anton1251
Post #6 (Отправлено: 30.09.2014 07:44)     Быстрое цитирование
Цитировать


Завсегдатай кофейни
**

Сообщений: 24
Регистрация: 16.07.2014
Niksen сказал
А, верно. В UTF надо desc на сервер ВМ передавать.

Спасибо) Попробую.

Но в документации же написано Интерфейс_X1, что передавать надо в win-1251 (CP1251)
название: invoice\desc
назначение: описание товара или услуги
примечание: произвольная строка от 0 до 255 символов; пробелы в начале или конце не допускаются, кодировка win-1251


Написать приватное сообщениеНаписать по email
anton1251
Post #7 (Отправлено: 30.09.2014 08:08)     Быстрое цитирование
Цитировать


Завсегдатай кофейни
**

Сообщений: 24
Регистрация: 16.07.2014
Niksen сказал
А, верно. В UTF надо desc на сервер ВМ передавать. Так а в какой кодировке у вас этот параметр передается в функцию. Если уже в UTF он туда попадает, то iconv не надо использовать.

И вот еще обратите внимание и попробуйте:

Можно даже преобразовать не в UTF-8, а в html-сущности, это тоже сработает:
$address=mb_convert_encoding($address, "HTML-ENTITIES","windows-1251"); $desc=mb_convert_encoding($desc, "HTML-ENTITIES","windows-1251");

Если же iconv и mbstring вашим сервером не поддерживаются, то могу предложить ещё один вариант. Оставьте $desc и $address в кодировке Win1251, а в начале XML-запроса вставляйте заголовок <?xml version='1.0' encoding='windows-1251'?>. Он укажет, что данные в пакете переданы в Win1251, и сервер WebMoney обработает их именно в этой кодировке. То есть пакет в этом случае будет начинаться так:

$xml="<?xml version='1.0' encoding='windows-1251'?>
<w3s.request>
...

Понятно, что если переменные $desc и $address были переданы в функцию _WMXML1(), уже пребывая в кодировке UTF-8, то никаких преобразований на этом этапе делать не нужно.

У меня оба файла идут в UTF-8, поэтому и в функцию они передаются в UTF-8.

Когда попробовал вот так
И вот еще обратите внимание и попробуйте:

Можно даже преобразовать не в UTF-8, а в html-сущности, это тоже сработает:
$address=mb_convert_encoding($address, "HTML-ENTITIES","windows-1251"); $desc=mb_convert_encoding($desc, "HTML-ENTITIES","windows-1251");

То получил вот такую запись в назначении платежа "РўР&micro;СЃС&sbquo;РѕРІС&lsaquo;Р№ СЃС&Dagger;С&lsquo;С&sbquo;" blush.gif , что-то очень страшное))

Сервером поддерживаются.

Указал "<?xml version='1.0' encoding='windows-1251'?>" и перекинул $rsign=_GetSign($orderid.$wmid.$purse.$amount.$desc.$address.$period.$expiration.$reqn); вниз вот сюда
$address=htmlspecialchars($address, ENT_QUOTES);
$desc=htmlspecialchars($desc, ENT_QUOTES);
$address=iconv("utf-8", "CP1251", $address);
$desc=iconv("utf-8", "CP1251", $desc);
$rsign=_GetSign($orderid.$wmid.$purse.$amount.$desc.$address.$period.$expiration.$reqn);

И всё заработало! Спасибо! good.gif

Интерес ещё в том, что после получения ответа сервера не нужно преобразовывать кодировку из windows-1251 в utf-8. Когда делал преобразование, то была белеберда, а когда сделал просто
$result['desc']=strval($xmlres->invoice->desc);

, то он уже в utf-8. Мы ответы от сервера ВМ получаем в utf-8?

Это сообщение отредактировал anton1251 - 30.09.2014 08:17


Написать приватное сообщениеНаписать по email
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции этого топика ОтветитьНовая тема

 





Powered by Invision Power Board © 2003 IPS, Inc.