Перейти к содержанию
Fire Monkey от А до Я
  • 0

[TIdTCPClient] Проблемы с кодировкой. Не удается на сервере получить ответ от клиента в нужной кодировке


Sergey Babichev

Вопрос

Уважаемые коллеги!

Никак не получается прочитать из клиента русский текст. Читается что-то вроде #fff8.
Вышел из положения, написав две функции:

function TranslitStr(s:string) : string;
const
  Rus = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  Eng = 'abcdefghijklmnopqrstuvwxyz~!@#$%&ABCDEFGHIJKLMNOPQRSTUVWXYZ()_+?><';
var
  i,j : integer;
  c : char;
begin
  Result := '';
  for i := 0 to length(s)-1 do begin
    c := s.Chars[i];
    if isLetter(c) then begin
       j := pos(c,Rus);
       if j > 0 then  c := Eng[j];
    end;
    Result := Result + c;
  end;
end;

и обратную к ней.

function UnTranslitStr(s:string) : string;
const
  Rus = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  Eng = 'abcdefghijklmnopqrstuvwxyz~!@#$%&ABCDEFGHIJKLMNOPQRSTUVWXYZ()_+?><';
var
  i,j : integer;
  c : char;
begin
  Result := '';
  for i := 0 to length(s)-1 do begin
    c := s.Chars[i];
    if isLetter(c) then begin
       j := pos(c,Eng);
       if j > 0 then  c := Rus[j-1];
    end;
    Result := Result + c;
  end;
end;

Ее вызывает сервер, когда отправляет данные на Андроид, обратная в Андроиде возвращает буквы на место.

 

Но так же быть не должно!

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Извините за дублирование, но я не знаю в какой кодировке она вообще приходит. Сервер берет данные из SQL Express и отправляет их в канал. Смотришь сервер в отладчике, в сокет идет нормальная строка. В Андроид из ИНДИ приходит хрень. Кто когда и как успел испортить?

Ссылка на комментарий
  • 0

'*356495042155004* '#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd' '#$fffd#$fffd#$fffd' '#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd' '#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd'*-40*2*H7041300945*'

Вот что приходит в Инди

 

А сервер отправляет это:

*356495042155004* Таймер при включенном зажигании*-40*2*H7041300945*

И то и то в UTF-8. Должно быть во всяком случае.

 

Ссылка на комментарий
  • 0

Код сервера

    else if cmd = 'trafic' then begin
        DM.qPSI_TraficTest.ParamByName('stock').AsString := sl[3];
        DM.qPSI_TraficTest.Open;
        while not DM.qPSI_TraficTest.Eof do begin
          responce := '*' + DM.qPSI_TraficTest.FieldByName('id').AsString+'*'+
                      TranslitStr(DecodeEventName(DM.qPSI_TraficTest.FieldByName('A_EVENT').AsInteger))+'*'+
                      TranslitStr(DM.qPSI_TraficTest.FieldByName('test').AsString)+'*'+
                      DM.qPSI_TraficTest.FieldByName('A_COUNT').AsString+'*'+
                      TranslitStr(DM.qPSI_TraficTest.FieldByName('zn').AsString)+'*'+
                       #$0d#$0a;
           OutputReport(responce);
           ClientSocket.SendText(responce);
           DM.qPSI_TraficTest.Next;
        end;
        DM.qPSI_TraficTest.Close;
        ClientSocket.SendText('EOF'+#$0d#$0a);
        ClientSocket.Disconnect(ClientSocket.Handle);
    end;

Код клиента

procedure TfRes.GetDetailTraffic(stk: string);
var
   cmd,s : string;
   cnt : integer;
begin
    if not Assigned(CurrServer) then Exit;
   cmd := '*'+imei+'*trafic*'+stk+'*';
   cnt := 0;
   idCl.Host := IP;
   idCl.Port := StrToInt(CurrServer.port);
   idCl.Disconnect;
   while idCl.Connected do ;
   try
     ad.Show;
     idCl.Connect();
     if idCl.Connected then begin
        idCl.Socket.Write(cmd);
        ad.Hide;
        pd.Show;
        repeat
           Sl.Clear;
           if not idCl.Connected then break;
           s := idCl.Socket.ReadLnWait(3,IndyTextEncoding_UTF8);
           if idCl.Socket.ReadLnTimedout then Exit;

           Inc(cnt);
           pd.Message := 'Получено '+IntToStr(cnt)+' записей';
//            pd.Message := s;
           if s <> 'EOF' then begin
              RE.Subject := s;
              RE.Split(SL,0);
              if Sl.Count > 1 then begin
                AddTr(SL[1],UnTranslitStr(SL[2]),SL[4],UnTranslitStr(SL[3]),UntranslitStr(SL[5]));
              end;
           end;
        until s = 'EOF';

     end;
   finally
     idCl.Disconnect;
      while idCl.Connected do ;
     ad.Hide;
     pd.Hide;
   end;
end;

Скриншоты сервера и клиента

post-818-0-19267600-1424252125_thumb.jpg

post-818-0-43881800-1424252146_thumb.png

Ссылка на комментарий
  • 0
function TranslitStr(s:string) : string;
const
  Rus = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  Eng = 'abcdefghijklmnopqrstuvwxyz~|@#$%&ABCDEFGHIJKLMNOPQRSTUVWXYZ{}[]?><';
var
  i,j : integer;
  c : char;
begin
  Result := UTF8Encode(WideString(s));
end;

UnTranslitStr на клиенте сейчас не делает ничего

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...