| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Проблема с кодировкой в SOAP |
| Автор: FatherFrost 12.4.2006, 07:44 |
| И так собственно сабж. Есть SOAP-сервер написанный на Делфях и размещенный под Апачем. Если пользоваться клиентом, написанным на Делфи, то все ОК... Но как только подклюяаюсь к веб-сервису из c#-приложения, то получаю нечитабельные строки, т.е. русские символы заменяются ?????. Как это можно побороть? |
| Автор: Snowy 12.4.2006, 09:05 | ||
| Проблема в том, что сервис тебе отдает юникод, который ты конвертишь согласно текущей локали. Вообще-то это вопрос по C#, а не к дельфи. На WinApi нужно просто при старте программы дать строчку:
|
| Автор: FatherFrost 12.4.2006, 09:16 |
| Snowy, т.е.таким образом я установлю для потока клиента использование юникода? |
| Автор: Snowy 12.4.2006, 09:20 |
| Нет. Таким образом ты заставишь свою программу думать, что она работает под русской виндой на русском языке. И соответственно все юникод перекодироки будут работать с поправкой на русский язык. |
| Автор: FatherFrost 12.4.2006, 09:22 |
| Snowy, не подскажешь как это сделать на Делфи? |
| Автор: Snowy 12.4.2006, 09:33 |
| http://forum.vingrad.ru/index.php?showtopic=82093 |
| Автор: FatherFrost 12.4.2006, 09:51 |
| К сожалению это не помогло, наверно все Апач портит... |
| Автор: Snowy 12.4.2006, 10:34 |
| Если бы он портил, то и в Delphi была бы кривая кодировка. Проверь: кокой язык родной у винды на сервере и какой на клиенте. |
| Автор: FatherFrost 12.4.2006, 10:39 |
| Так все стоит пока на одной машине |
| Автор: Snowy 12.4.2006, 10:48 |
| Тогда действительно странно. Значит нужно смотреть маппером или снифером, что идет от сервера клиенту. Ну или из свое программы скинуть в лог файл весь траффик и посмотреть его глазами. Если скинешь - выложи здесь в прямом и HEX виде. Я посмотрю глазками и скажу, что с этим делать. |
| Автор: FatherFrost 12.4.2006, 20:51 |
| Ок. Посмотрю завтра... Может еще сам чего накопаю |
| Автор: FatherFrost 13.4.2006, 08:08 |
| Чето начал разбираться и совсем запутался... Не подскажешь нормальный снифер. |
| Автор: Snowy 13.4.2006, 08:35 |
| Подскажу маппер: http://forum.vingrad.ru/index.php?showtopic=89811&st=0&#entry689298 |
| Автор: RA 13.4.2006, 09:54 |
| Знакомая проблема, подобное наблюдал при написании приложения клиент сервер. В моём случаи передоваемые клиенту списки директорий и файлов содержащие русские символы передовались в виде "???????" Проблему не решил, списал её на косяк ОС, тот самый когда при копировании русского текста вставляется "??????" Проэкт сдал, деньги получил. |
| Автор: FatherFrost 13.4.2006, 13:54 | ||
Вот пример тела одного пакета:
|
| Автор: Snowy 13.4.2006, 14:08 |
| не то. Здесь нет текста. |
| Автор: FatherFrost 13.4.2006, 14:33 | ||||
Вот идет ответный пакет от сервера сразу после запроса:
Добавлено @ 14:42 Сорри, то служебный пакет. Вот ответ сервера:
|
| Автор: FatherFrost 14.4.2006, 09:26 |
| Snowy, В строках 45 - 47. Могет есть какие-нить идеи? |
| Автор: Snowy 14.4.2006, 11:22 | ||
Хе. Да это банальный UTF-8.
И получаем "ул.ЩОРСА УЛИЦА д.5 кв.99" Что и логично - UTF-8 родной для xml. |
| Автор: FatherFrost 14.4.2006, 12:02 |
| Понятно, тогда скорее нуно шарп мучать... Огромное спасибо за помощь. |
| Автор: FatherFrost 14.4.2006, 12:55 |
| Возник вопрос, а можно заставить респонся отсылать в UTF 16 |
| Автор: Snowy 14.4.2006, 13:03 |
| Да. Можно. Для этого нужно у TXMLDocument установить Encoding := 'UTF-16'; |
| Автор: FatherFrost 14.4.2006, 13:06 |
| Snowy, ну это для XML, а для веб сервиса как быть??? |
| Автор: Snowy 14.4.2006, 13:14 |
| А это уже зависит от реализации веб-сервиса. А он скорее всего также юзает этот же XML контрол. Если нет, то нужно ковыряться в нем, чтобы узнать как и чего он кодирует. |
| Автор: FatherFrost 14.4.2006, 13:22 |
| Я уже нашел. Для THTTPSoapDispatcher и THTTPSoapPascalInvoker у Converter'a есть свойство Encoding. Его нужно было установить UTF-16, т.к. в C# строки в этой кодировке... У меня кодировка указана не была, поэтому ответ шел без указания кодировки (вот она главная причина нестыковки). |