Войти

Показать полную графическую версию : idTcpServer и idTcpClient не корректное отображения русских букв.


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

AlexVol
16-05-2012, 17:42
используйте ansistring

tier_skg
21-05-2012, 21:58
Где этот тип переменных использовать? Я вроде на прием и передачу делал.
К примеру вот простейший клиент сервер: 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
В Delphi, начиная с 2009 версии тип String = UnicodeString.
Indy, к сожалению, пока не умеет работать со строками Unicode, зато прекрасно работает со строками AnsiString.
Что бы получить желаемый Вами результат в коде (как на стороне клиента, так и на стороне сервера) необходимо явно указать кодовую станицу компонентам Indy при передаче/приеме строк.
Т.е. вместо:

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

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

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




© OSzone.net 2001-2012