Проблемма soap и utf8

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
alik1
новенький
Сообщения: 24
Зарегистрирован: 16.01.2007 00:14:03

Проблемма soap и utf8

Сообщение alik1 »

Использую Web Service Toolkit для работы с функциями сервера и столкнулся с таким траблом .. посылают мне строчку utf8, a приходит:

Код: Выделить всё

00000240                     3C 00  4D 00 65 00 73 00 73 00         <.M.e.s.s.
00000256   61 00 67 00 65 00 3E 00  3F 00 3F 00 3F 00 3F 00   a.g.e.>.?.?.?.?.
00000272   3F 00 3F 00 3F 00 3F 00  3F 00 20 00 3F 00 3F 00   ?.?.?.?.?. .?.?.
00000288   3F 00 3F 00 3F 00 3C 00  2F 00 4D 00 65 00 73 00   ?.?.?.<./.M.e.s.
00000304   73 00 61 00 67 00 65 00  3E 00                     s.a.g.e.>.


есть ли возможность указать какой то хитрый тип данных, a не просто стринг, чтоб решить эту пробмлему?

версии WST, Laarus и fpc - последние
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

1. Данные представленны в кодировке Unicode - это не совсе UTF8
2. Судя по дампу (представленному вами) данные верны (в кодировке Unicode или UTF16) и соответствуют

Код: Выделить всё

<Message>????????? ?????</Message>
alik1
новенький
Сообщения: 24
Зарегистрирован: 16.01.2007 00:14:03

Сообщение alik1 »

скажем так, данные которые я показываю в дампе, действительно результат сохранения потока в уникод. но изначально это обычный стринг, в котором послан utf8. хотел продемонстрировать, что тулкит где то "зарезает" utf8 ...

Код: Выделить всё

procedure TMy.ExecMySoapFunc;
var m : TMemoryStream;
     ws : widestring;
begin
   ws := Utf8Decode(MySoapInt.RealFunc); //soap function that return utf8 string ...
   m := TMemoryStream.Create;
   m.Write(PWideChar(ws)^, Length(ws)*2);
   m.Position:= 0;
   m.SaveToFile('xml_set.txt'); //<- dump from this file
   m.Position:=0;
   ReadXMLFile(fXML,m);
   m.Free;
   //...
end;


сервер прекрасно работает и посылает кирилицу, которую не зарезает HTTPRIO в дельфи.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

А вот это зачем у Вас написано:
alik1 писал(а):ws := Utf8Decode(MySoapInt.RealFunc);
...
PWideChar(ws)^, Length(ws)*2

???
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Функция ReadXMLFile прекрасно работает с UTF-8 так что уберите преобразование Utf8Decode
alik1
новенький
Сообщения: 24
Зарегистрирован: 16.01.2007 00:14:03

Сообщение alik1 »

чувствую, что дискуссия отошла от моей проблематики )

значит так .. получаю строку utf8 от soap-функции такого вида

Код: Выделить всё

 ...
  MySoap = interface(IInvokable)
    function MyFunc():string;
  end;
 ...
procedure Test;
begin
  MessageBoxW(0, PWideChar(UTF8Decode(MySoapImpl.MyFunc)), nil, 0);
end;

получаю вместо кирилицы - вопросики ...
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

MessageBox(0, PChar(UTF8ToAnsi(MySoapImpl.MyFunc)), nil, 0);?
alik1
новенький
Сообщения: 24
Зарегистрирован: 16.01.2007 00:14:03

Сообщение alik1 »

Vadim писал(а):MessageBox(0, PChar(UTF8ToAnsi(MySoapImpl.MyFunc)), nil, 0);?

не хотелось бы уходить в ансишные строки, мне это не совсем подходит у меня и винда не русская :)
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

alik1 писал(а):не хотелось бы уходить в ансишные строки...

Не уходите. :) Только скажите, что Вы увидели именно с этим MessageBox.
alik1
новенький
Сообщения: 24
Зарегистрирован: 16.01.2007 00:14:03

Сообщение alik1 »

вы не поверите, те же самые вопросительные знаки ;) на самом деле я всё же подозреваю, что "зарезание" происходит в имплементации стрингов в webtoolkit-e
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

А что за webtoolkit - то? Это часть FPC или сторонняя библиотека?
alik1
новенький
Сообщения: 24
Зарегистрирован: 16.01.2007 00:14:03

Сообщение alik1 »

http://wiki.lazarus.freepascal.org/Web_Service_Toolkit

вроде бы официальный ...

Добавлено спустя 12 часов 5 минут 15 секунд:
вопрос снят с повестки дня - как только стали передавать utf8 строку в base64, сразу же всё отлично заработало :)
Ответить