powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IdSyslogServer кодировка
11 сообщений из 11, страница 1 из 1
IdSyslogServer кодировка
    #39622117
nikolll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ помогите не могу разобраться как менять кодировку в IdSyslogServer в Delphi.

Написал тестовый syslogsever сервер используя компоненты IdSyslogServer и IdSysLogMessage.

Данный сервер получает сообщения от клиента в латинице нормально, но если посылается кириллица то сервер получает кракозябры.

Вот код получения сообщения.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.IdSyslogServer1Syslog(Sender: TObject;
  ASysLogMessage: TIdSysLogMessage; ABinding: TIdSocketHandle);
begin
 
IdSysLogMessage1 := ASysLogMessage;
Memo1.Lines.Add ('-----------------------------------');
Memo1.Lines.Add ( IdSysLogMessage1.Msg.Text );
end;


Подскажите что поменять чтобы кириллица нормально воспринималась?

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622136
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolll,

Если принудительно перевести текст сообщения из UTF8 - кракозярбы уходят?
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622140
nikolll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

Остаются, да текст посылается в формате KOI8-r
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622150
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolll,

Ну так переведи из KOI8 и будет тебе щастье.
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622156
nikolll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

Подскажешь как?
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622182
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolll,

Версию Delphi скажи - если после D2009 - все просто, если до нее - несколько телодвижений нужно будет.
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622188
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolll,

Так попробуй:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
function WideStringToAnsiStringEx(const WS: WideString; CodePage: Word): AnsiString;
var
  InputLength,
  OutputLength: Integer;
begin
  InputLength := Length(WS);
  OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil);
  SetLength(Result, OutputLength);
  WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
end;

Function AnsiStringToUnicode(S:AnsiString):string;
begin
 Result:=AnsiStringToWideStringEx(S,GetACP);
end;

Function UnicodeToAnsiString(S:string):AnsiString;
begin
  Result:=WideStringToAnsiStringEx(S,GetACP);
end;


Function RecodeString(S:String; FromCodePage,ToCodePage:DWORD):string;
var Len:Integer;
    wcBuf:PWideChar;
    pcBuf:PAnsiChar;
    SBuf:AnsiString;
begin
  if S='' then Result:=S
  else begin
         SBuf:=UnicodeToAnsiString(S);
         Len:=Length(SBuf);
         GetMem(wcBuf,Len*2+2);
         try
           MultiByteToWideChar(FromCodePage,0,PAnsiChar(SBuf),Len,wcBuf,Len);
           GetMem(pcBuf,Len+1);
           (pcBuf+Len)^:=#0;
           try
             WideCharToMultiByte(ToCodePage,0,wcBuf,Len,pcBuf,Len,nil,nil);
             SetLength(Result,Len);
             Result:=AnsiStringToUnicode(AnsiString(pcBuf));
           finally FreeMem(pcBuf); end;
         finally FreeMem(wcBuf); end;
       end;
end;

// использование
Memo1.Lines.Add(RecodeString(StringFromServer,20866,1200));  // KOI8 == 20866, UNICODE == 1200
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39622206
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolll,

А это - коротенькая реализация для D2009 и выше:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function RecodeString(S:String; FromCodePage,ToCodePage:DWORD):string;
var FEnc,TEnc:TEncoding;
begin
  FEnc:=TEncoding.GetEncoding(FromCodePage); TEnc:=TEncoding.GetEncoding(ToCodePage); 
  try
    Result:=StringOf(TEncoding.Convert(FEnc,TEnc,BytesOf(S)));
  finally FEnc.Free; TEnc.Free;  end;
end;

// использование
Memo1.Lines.Add(RecodeString(StringFromServer,20866,1200));
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39623262
nikolll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все что писалось выше не помогла.
Проблема была в компоненте TIdSysLogMessage;
Написал свою обработку.

Вот код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
var
  Form1: TForm1;
  str:string;
  msData: TMemoryStream;

............

procedure TForm1.IdSyslogServer1Syslog(Sender: TObject;
  ASysLogMessage: TIdSysLogMessage; ABinding: TIdSocketHandle);

begin
 Memo1.Lines.Add(str);
 str:=''; 
 msData.Free;
end;



procedure TForm1.IdSyslogServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
 Buff: TBytes;
 
begin
 
msData := TMemoryStream.Create;
 msData.Write(AData[0], Length(AData));
 msData.Seek(0, soFromBeginning);
 SetLength(Buff, msData.Size);
 msData.Position := 0;
 msData.Read(Buff[0], msData.Size);

  if msData.Size <> 0 then
   begin
     str := TEncoding.Default.GetString(Buff);

  end;
 end;

end.
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39623267
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolll,

Т.к. TIdBytes это тот же TBytes, то можно проще
Код: pascal
1.
str := TEncoding.Default.GetString(TBytes(АData));



Кстати, манипуляции с MemoryStream у тебя попахивают :(
...
Рейтинг: 0 / 0
IdSyslogServer кодировка
    #39623332
nikolll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

Да согласен с тобой, код нужно оптимизировать, он он такой из-за того что ума чего побывал.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IdSyslogServer кодировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]