Показать полную графическую версию : 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. И так с любыми русскими символами.
Уже программу практически написал и тут такой косяк, помогите!!
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.
В Delphi, начиная с 2009 версии тип String = UnicodeString.
Indy, к сожалению, пока не умеет работать со строками Unicode, зато прекрасно работает со строками AnsiString.
Что бы получить желаемый Вами результат в коде (как на стороне клиента, так и на стороне сервера) необходимо явно указать кодовую станицу компонентам Indy при передаче/приеме строк.
Т.е. вместо:
...
ReadLn;
WriteLn(S);
...
нужно писать:
...
ReadLn(TEncoding.ANSI);
WriteLn(S, TEncoding.ANSI);
...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.