Конференция "Сети" » TClientSocket и TServerSocket проблема с кодировкой в D2009
 
  • Sanprof (03.10.10 19:16) [0]
    Здравствуйте господа программисты, столкнулся с такой проблемой в D2009, откомпилировал два готовых проекта сделаных в D7 - это клиент-серверные приложения на TClientSocket и TServerSocket. Теперь при посылке сообщения ClientSocket1.Socket.SendText('Привет, мир'), на сервере получается (при Socket.ReciveText()) какие-то китайские символы либо знаки вопросов. Слышал, что в D2009-D2010 так спешили перейти на UTF8, что забыли в некоторых функциях применить преобразование.
    Может уже кто сталкивался с таким, или знает как решить???
  • Сергей М. © (03.10.10 20:50) [1]

    > как решить?


    Перекомпилить исх.тексты компонентов
  • Sanprof (04.10.10 09:30) [2]
    пришлось заменить SendText(S) на SendBuf(Pointer(S)^, Length(S)*Sizeof(Char)*2); только тогда нормально начал передаваться и русский и английский текст.
  • Anatoly Podgoretsky © (04.10.10 11:57) [3]
    Это все от неумения и непонимания Юникода. Тебя никто не заставлять в фунцию передавать Юникод.
  • k0nstantin (16.08.11 18:36) [4]
    ТОЖЕ столкнулся с такой проблемой и вот что нашел на сайте Embarcadero Forum
    (перевод с англ.)
    Кажется, что Вы передаете 'Строковые' значения как есть к сокетам.
    'Строковый' тип - теперь Unicode UTF-16 в 2009, таким образом, необходимо обновить свой код учитывая это. Если Ваш протокол требует 8-разрядных символов, то Вы
    должны преобразовать Ваши значения в AnsiString или UTF8String, когда
    передаете их, и затем преобразовывать их назад в UTF-16, получая их.
  • K0nstantin (16.08.11 18:40) [5]
    Тоже столкнулся с подобной проблемой и вот что нашел на форуме Embarcadero
    (перевод с англ.)
    Кажется, что Вы передаете 'Строковые' значения как есть к сокетам.
    'Строковый' тип - теперь Unicode UTF-16 в 2009, таким образом, необходимо обновить свой код, учитывая это. Если Ваш протокол требует 8-разрядных символов, то Вы
    должны  преобразовать Ваши значения в AnsiString или UTF8String, когда
    передаете их, и затем преобразовывать их назад в UTF-16, получая их.
  • K0nstantin (16.08.11 18:42) [6]
    НУ и собственно вот так буржуи предлагают исправить ситуацию:

    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));
  • K0nstantin (16.08.11 18:46) [7]
    НЕ ПОМОГЛО.......
  • k0nstantin (16.08.11 19:41) [8]
    После долгих мучений удалось пердать и получить текст, но только латиницей, русский язык, великий и могучий, не удается прочитать.

    .......отправка
    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;
  • Сергей М. © (16.08.11 20:38) [9]
    Ну и накой хрен ты кодируешь передаваемую строку в Utf8 ?
    Вразумительное объяснение этому есть ?)
  • Сергей М. © (16.08.11 20:40) [10]
    Тебе нужно ANSI-строку передавать, коль уж ждешь ее именно
    как оную)


    > var s: AnsiString;
  • K0nstantin (17.08.11 06:10) [11]
    Действительно:

    код отправки  (текст отправляется из мемо)...............
    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;

    БЛОГОДАРЮ ЗА ПОМОЩЬ!!!!!!!!!!!!!!
  • k0nstantin (17.08.11 11:54) [12]
    Еще одна странность

    При запуске из под 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
  • K0nstantin (17.08.11 12:44) [13]
    ИЗвиняюсь за беспокойство , все разобрался
    Под семерку прогу нужно запускать в режиме совместимости с WinXP SP2
    и пришло счастье..........
  • K0nstantin (17.08.11 12:45) [14]
    Короче Сокеты в семерке работают по другому......
    НУ БИЛЛ ГЕЙТС :) :) ......
 
Конференция "Сети" » TClientSocket и TServerSocket проблема с кодировкой в D2009
Есть новые Нет новых   [134435   +18][b:0][p:0]