- 0
IdTCPClient, IdTCPSever - снова о кодировке
-
Похожий контент
-
- 4 ответа
- 3 689 просмотров
-
TIdHTTP [TidHTTP] Кодировка ответа сервера на загрузку файла
От serg557,
- загрузка файла
- HTTP
- (и ещё 1 )
- 5 ответов
- 3 183 просмотра
-
- 9 ответов
- 3 422 просмотра
-
-
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Вопрос
Wovan2
Здравствуйте.
Немного предыстории. Нужно соорудить клиент-сервер. Клиент на Android, сервер на Windows.
Собственно перебираю варианты.
1. Сделал с помощью DataSnap. Работает. Но очень громоздко и не понятно.
2. Tethering. Так и не смог реализовать обмен данными между сервером и клиентом типа запрос-ответ.
3. IdTCPClient, IdTCPSever. Раньше (D7) опыт работы отрицательный, но в FMX, видимо, альтернативы нет.
Так что сейчас предварительно реализую простой диалог запрос-ответ. Причем все вроде работает. И кода немного и быстро. НО. Уперся в кодировку. На клиенте (Android) не получается прочитать кириллицу. Сначала пробовал общаться Read, Write и передавать просто строки. Пробовал всякие индийские компоненты для кодировки. Но без понимания ничего и не получилось. В интернете где-то наткнулся на предложение передавать потоками. Реализовал. Стало лучше, но проблема с кодировкой не пропала. Скажем так, эта проблема уменьшилась вдвое. На стороне сервера все ОК. На стороне клиента либо знаки "????", либо ромбики с вопросами, либо ошибка "No mapping for the unicode character exists in the target multi-byte code page". Это я бессистемно перебирал варианты кодировок. К сожалению до сих пор так и не понимаю эти перекодировки. Вернее не так. Не понимаю откуда и куда идут какие кодировки.
В общем помогите пожалуйста советом или кодом. Ниже код с которым экспериментирую. (код не большой)
Сервер
procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
var
s : TStringStream;
begin
s := TStringStream.Create;
mem.Lines.Add(AContext.Connection.Socket.Binding.PeerIP);
AContext.Connection.IOHandler.ReadStream(s);
s.Position := 0;
mem.Lines.Add(Utf8ToAnsi(s.ReadString(s.Size)));
s.Free;
s := TStringStream.Create;
s.WriteString('И тебе привет');// And You, Hi с этим все нормально, проблема только с русскими буквами
s.Position := 0;
AContext.Connection.IOHandler.Write(s,s.Size,true); //здесь s.Size = 13. в 26 никак не получается превратить, может быть тут что-то?
s.Free;
end;
Клиент
procedure TfrmMainClient.btn1Click(Sender: TObject);
var s:TStringStream;
begin
s := TStringStream.Create;
try
IdTCPClient.Connect;
if IdTCPClient.Connected
then mem.Lines.Add('Есть контакт с сервером ' + IdTCPClient.Socket.Binding.PeerIP);
s.WriteString('Привет');
s.Position := 0;
IdTCPClient.IOHandler.Write(s, s.Size, true);//здесь заметил, что s.Size = 12, похоже на unicode
s.Clear;
IdTCPClient.IOHandler.ReadStream(s);
s.Position := 0;
Mem.Lines.Add(s.ReadString(s.Size)); //ошибка здесь
finally
IdTCPClient.Disconnect;
if Assigned(s)
then s.Free;
end;
end;
Этот код приводит на клиента к ошибке "No mapping for the unicode character exists in the target multi-byte code page". На сервере сообщение "Привет" видно нормально.
Помогите, кто чем может.
ЗЫ. Тему "Как Получить текст по TCP (Indy) в нужной кодировке?" смотрел. Но либо она не актуальна (инди уже изменился), либо я не смог правильно понять. По крайней мере пробовал использовать это в самом начале, когда пытался передавать строки напрямую. В указанном коде IIdTextEncoding не представляю куда и как вставить.
зы2: Извините. Пишу на Delphi 10.2. Indy 10.6.2(в комплекте с Delphi). Windows 10. Android 4 и 5
Изменено пользователем Wovan2правка
Ссылка на комментарий
14 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.