-
Здравствуйте господа программисты, столкнулся с такой проблемой в D2009, откомпилировал два готовых проекта сделаных в D7 - это клиент-серверные приложения на TClientSocket и TServerSocket. Теперь при посылке сообщения ClientSocket1.Socket.SendText('Привет, мир'), на сервере получается (при Socket.ReciveText()) какие-то китайские символы либо знаки вопросов. Слышал, что в D2009-D2010 так спешили перейти на UTF8, что забыли в некоторых функциях применить преобразование. Может уже кто сталкивался с таким, или знает как решить???
-
> как решить?
Перекомпилить исх.тексты компонентов
-
пришлось заменить SendText(S) на SendBuf(Pointer(S)^, Length(S)*Sizeof(Char)*2); только тогда нормально начал передаваться и русский и английский текст.
-
Это все от неумения и непонимания Юникода. Тебя никто не заставлять в фунцию передавать Юникод.
-
ТОЖЕ столкнулся с такой проблемой и вот что нашел на сайте Embarcadero Forum (перевод с англ.) Кажется, что Вы передаете 'Строковые' значения как есть к сокетам. 'Строковый' тип - теперь Unicode UTF-16 в 2009, таким образом, необходимо обновить свой код учитывая это. Если Ваш протокол требует 8-разрядных символов, то Вы должны преобразовать Ваши значения в AnsiString или UTF8String, когда передаете их, и затем преобразовывать их назад в UTF-16, получая их.
-
Тоже столкнулся с подобной проблемой и вот что нашел на форуме Embarcadero (перевод с англ.) Кажется, что Вы передаете 'Строковые' значения как есть к сокетам. 'Строковый' тип - теперь Unicode UTF-16 в 2009, таким образом, необходимо обновить свой код, учитывая это. Если Ваш протокол требует 8-разрядных символов, то Вы должны преобразовать Ваши значения в AnsiString или UTF8String, когда передаете их, и затем преобразовывать их назад в UTF-16, получая их.
-
НУ и собственно вот так буржуи предлагают исправить ситуацию:
var s: AnsiString; SetLength(s, ServerSocket1.Socket.Connections [0].ReceiveLength); SetLength(s, ServerSocket1.Socket.Connections [0].ReceiveBuf(Pointer(s)^, Length(s))); Memo1.Lines.Add (String(s));
или
var s: AnsiString; SetLength(s, Socket.ReceiveLength); SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s))); Memo1.Lines.Add (String(s));
-
НЕ ПОМОГЛО.......
-
После долгих мучений удалось пердать и получить текст, но только латиницей, русский язык, великий и могучий, не удается прочитать.
.......отправка procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket.Socket.SendText(Utf8Encode('Hello Konstantin')); end;
.........прием procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var s: AnsiString; begin SetLength(s, Socket.ReceiveLength); SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s))); Memo1.Lines.Add (String(s)); end;
-
Ну и накой хрен ты кодируешь передаваемую строку в Utf8 ? Вразумительное объяснение этому есть ?)
-
Тебе нужно ANSI-строку передавать, коль уж ждешь ее именно как оную)
> var s: AnsiString;
-
Действительно:
код отправки (текст отправляется из мемо)............... procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); var S:AnsiString; begin S:=AnsiString(Memo2.Lines[Memo2.Lines.Count - 1]); ClientSocket.Socket.SendText(S); ClientSocket.Active:=False; end;
Код получения............... procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var s: AnsiString; begin SetLength(s, Socket.ReceiveLength); SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s))); Memo1.Lines.Add (String(s)); end;
БЛОГОДАРЮ ЗА ПОМОЩЬ!!!!!!!!!!!!!!
-
Еще одна странность
При запуске из под Delphi (после компиляции) все работает отлично.
Но при запуске готового exe файла проекта Сервер Сокет не может инициализироваться:
(Вызываю ServerSocket.Active:=True из метода OnShow главной формы проги)
procedure TForm1.FormShow(Sender: TObject); begin ......... try if not ServerSocket.Active then ServerSocket.Active:=True; except on e:exception do begin MessageDlg('Не могу открыть сокет для работы в сети. '+#13#10+ E.Message,mtError,[mbOk],0); end; end; ...... end;
Ось Windows 7, Delphi 2009
-
ИЗвиняюсь за беспокойство , все разобрался Под семерку прогу нужно запускать в режиме совместимости с WinXP SP2 и пришло счастье..........
-
Короче Сокеты в семерке работают по другому...... НУ БИЛЛ ГЕЙТС :) :) ......
|