Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   idTcpServer и idTcpClient не корректное отображения русских букв. (http://forum.oszone.net/showthread.php?t=234385)

tier_skg 10-05-2012 19:22 1913599

idTcpServer и idTcpClient не корректное отображения русских букв.
 
Здравствуйте уважаемые форумчане!
Писал сетевую программу используя idTcpServer и idTcpClient и заметил что за место русских букв отображаются вопросительные знаки.
Передаю например строку вот так: IdTCPClient1 .Socket .WriteLn('привет 123 hello');
Получаю вот так: edit1.text :=AContext .Connection .Socket .ReadLn ;
В edit1 в итоге ???123 hello. И так с любыми русскими символами.
Уже программу практически написал и тут такой косяк, помогите!!

AlexVol 16-05-2012 17:42 1917125

используйте ansistring

tier_skg 21-05-2012 21:58 1920074

Где этот тип переменных использовать? Я вроде на прием и передачу делал.
К примеру вот простейший клиент сервер:
Код:

unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdCustomTCPServer, IdTCPServer, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, StdCtrls,IdContext ;

type
  TForm5 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    IdTCPServer1: TIdTCPServer;
    IdTCPClient1: TIdTCPClient;
    procedure IdTCPServer1Execute(AContext: TIdContext);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
  var a:AnsiString ;
begin
 IdTCPClient1.Connect;
 a:= Edit1 .text;
 IdTCPClient1 .Socket .WriteLn(a);
  IdTCPClient1.Disconnect;
end;

procedure TForm5.IdTCPServer1Execute(AContext: TIdContext);
var b:AnsiString ;
begin
b:= AContext.Connection.Socket.ReadLn;
edit2.Text := b;

AContext .Connection .Disconnect ;


end;

end.


Nasgool 05-12-2012 08:39 2038964

В Delphi, начиная с 2009 версии тип String = UnicodeString.
Indy, к сожалению, пока не умеет работать со строками Unicode, зато прекрасно работает со строками AnsiString.
Что бы получить желаемый Вами результат в коде (как на стороне клиента, так и на стороне сервера) необходимо явно указать кодовую станицу компонентам Indy при передаче/приеме строк.
Т.е. вместо:

...
ReadLn;
WriteLn(S);
...

нужно писать:

...
ReadLn(TEncoding.ANSI);
WriteLn(S, TEncoding.ANSI);
...


Время: 13:59.

Время: 13:59.
© OSzone.net 2001-