Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IdSyslogServer кодировка / 11 сообщений из 11, страница 1 из 1
28.03.2018, 15:28
    #39622117
nikolll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IdSyslogServer кодировка
Народ помогите не могу разобраться как менять кодировку в 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
28.03.2018, 15:56
    #39622136
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IdSyslogServer кодировка
nikolll,

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

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

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

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

Версию Delphi скажи - если после D2009 - все просто, если до нее - несколько телодвижений нужно будет.
...
Рейтинг: 0 / 0
28.03.2018, 16:48
    #39622188
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IdSyslogServer кодировка
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
28.03.2018, 16:59
    #39622206
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IdSyslogServer кодировка
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
30.03.2018, 13:35
    #39623262
nikolll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IdSyslogServer кодировка
Все что писалось выше не помогла.
Проблема была в компоненте 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
30.03.2018, 13:44
    #39623267
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IdSyslogServer кодировка
nikolll,

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



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

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


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