Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировка Indy10, Проблемы с ANSI, билд 4537, delphi 2006 
V
    Опции темы
dvamaster
  Дата 27.12.2010, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



Доброго времени суток!!! Indy 10 билд 4537

при отправке через сокет строки с русскими буквами они конвертируются в вопросы.

Код

    AContext.Connection.Socket.Write(msg); // где msg строка


корявое преобразование происходит в функции ToBytes, обратите внимание на AByteEncoding и ASrcEncoding

Код

procedure TIdIOHandler.Write(const AOut: string; AByteEncoding: TIdTextEncoding = nil
  {$IFDEF STRING_IS_ANSI}; ASrcEncoding: TIdTextEncoding = nil{$ENDIF}
  );
begin
  if AOut <> '' then begin
    AByteEncoding := iif(AByteEncoding, FDefStringEncoding);
    {$IFDEF STRING_IS_ANSI}
    ASrcEncoding := iif(ASrcEncoding, FDefAnsiEncoding, encOSDefault);
    {$ENDIF}
    Write(
      ToBytes(AOut, -1, 1, AByteEncoding
        {$IFDEF STRING_IS_ANSI}, ASrcEncoding{$ENDIF}
        )
      );
  end;
end;


далее в глубину вложения функций упираемся в

Код

function TIdASCIIEncoding.GetBytes(AChars: PIdWideChar; ACharCount: Integer;
  ABytes: PByte; AByteCount: Integer): Integer;
var
  i : Integer;
begin
  Result := IndyMin(ACharCount, AByteCount);
  for i := 1 to Result do begin
    // replace illegal characters > $7F
    if Word(AChars^) > $007F then begin
      ABytes^ := Byte(Ord('?'));
    end else begin
      ABytes^ := Byte(AChars^);
    end;
    //advance to next char
    Inc(AChars);
    Inc(ABytes);
  end;
end;


а вот и пресловутый кусочек

Код

if Word(AChars^) > $007F then begin
      ABytes^ := Byte(Ord('?'));
    end else begin
      ABytes^ := Byte(AChars^);


выходит все в этих классах.

Вывод, как от этого преобразования избавиться?


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Akella
Дата 27.12.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



передавать в юникоде?
PM MAIL   Вверх
salik
Дата 28.1.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 28.1.2011

Репутация: 1
Всего: 1



Чтобы небыло кракозябры надо делать так:

посылаем:
Код

procedure TForm1.Button3Click(Sender: TObject);
begin
  Client.IOHandler.WriteLn(Edit1.Text, TEncoding.UTF8);
end;


Принимаем:
Код

procedure TForm1.SrvExecute(AContext: TIdContext);
begin
  REMessList.Lines.Add(AContext.Connection.IOHandler.ReadLn(TEncoding.UTF8));
end



PM MAIL   Вверх
salik
Дата 1.2.2011, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 28.1.2011

Репутация: 1
Всего: 1



Задача в том, чтобы принять русский текст в параметрах. Проблема в том что текст отображается "плохо".

после подключение поумалчанию ставлю кодовую страницу UTF8
Код

procedure TForm1.AClientOnExecute(Sender: TObject);// событие ActionList
begin
  try
     Client.Connect;
     Client.Socket.DefStringEncoding := enUTF8;    
  except on E: EIdException do
     REMessList.Lines.Add('Ошибка при подключении клиента: ' + E.Message);
  end;
end;


подскажите что я делаю не так
Код

procedure TForm1.SrvCommandHandlers0Command(ASender: TIdCommand);
begin
  if ASender.Params.Count = 2 then begin
    CS := TCriticalSection.Create;
    try
     CS.Enter;
     ASender.Context.Connection.Socket.DefStringEncoding := enUTF8;      
     REMessList.Lines.Add('выполнено('+ASender.Params[0]+')' + #13 + 'выполнено('+ASender.Params[1]+')');
     ASender.Reply.Text.Text := 'test vipolnen';
    finally
     CS.Leave;
     CS.Free;
    end;
    ASender.Reply.Text.Text := 'test vipolnen';
  end;
end;


PS: иероглифы выходят только при выполнении команды первый раз . Потом проблем нет. (TiDCMDTCPServer TIDCMDTCPClient)

Это сообщение отредактировал(а) salik - 2.2.2011, 01:00
PM MAIL   Вверх
dvamaster
Дата 27.2.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



salik, спасибо  smile

Добавлено через 2 минуты и 11 секунд
Цитата(salik @  2.2.2011,  02:45 Найти цитируемый пост)
иероглифы выходят только при выполнении команды первый раз

Попробуй в OnConnect сделать, один раз

Это сообщение отредактировал(а) dvamaster - 27.2.2011, 17:27


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
salik
Дата 8.3.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 28.1.2011

Репутация: 1
Всего: 1



Как альтернативу к enUTF8 можно использовать конструкцию 
Код

TIdTextEncoding.GetEncoding(866);


Входной параметр функции - это кодовая страница. 
Это работает (обычный windows клиент telnet отображает корректно русский текст).

Вы можете указать свое значение, например 1251.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.