我做了一个简单的Indy HTTP GET函数,使用Windows客户端和服务器可以很好地工作,但是在Android中使用客户端时,由于使用UTF8字符而尝试将StringStream加载到StringList时,它停滞不前。如何将UTF8字符的StringStream加载到Android中的StringList中?
客户端(线程内):
var
ss:TStringStream;
st:TStringList;
begin
ss := TStringStream.Create('',TEncoding.UTF8);
IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)';
IdHTTP1.Get('http://motoristaajudante.ddns.net:37009/-23.671373,-046.700072',ss);
ss.Position := 0;
st := TStringList.Create;
st.LoadFromStream(ss); // <<< Crash in this line on Android, on Windows works fine
end;
服务器:
procedure TfrmMain.DownloadServer9CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); // Indy HTTP Server
var
Enviar:TStringList;
EnvioStream:TMemoryStream;
begin
try
Enviar := TStringList.Create;
Enviar.Add('11111111111111111111111111111111111111 0006 Jardim São Caetano|Fique mais próximo'+' do conjunto de prédios do Jardim São Caetano para aumentar as chances de receber um chamado. Tente parar exatamente onde é apontado no mapa. ¬iMobby¬d19/09/2017 00:00:00 2359235923592359 0012 000 23590 ¬§');
Enviar.Add('11111111111111111111111111111111111111 0006 Jardim São Caetano|Fique mais próximo'+' do conjunto de prédios do Jardim São Caetano para aumentar as chances de receber um chamado. Tente parar exatamente onde é apontado no mapa. ¬iMobby¬d19/09/2017 00:00:00 2359235923592359 0012 000 23590 ¬§');
Enviar.Add('11111111111111111111111111111111111111 0006 Jardim São Caetano|Fique mais próximo'+' do conjunto de prédios do Jardim São Caetano para aumentar as chances de receber um chamado. Tente parar exatamente onde é apontado no mapa. ¬iMobby¬d19/09/2017 00:00:00 2359235923592359 0012 000 23590 ¬§');
Enviar.Add('@');
// if switching the above strings to only numbers and letters then the client loads the StringList normally on Android
EnvioStream := TMemoryStream.Create;
Enviar.SaveToStream(EnvioStream);
AResponseInfo.ContentStream := EnvioStream;
AResponseInfo.WriteContent;
finally
Enviar.Free;
Enviar := nil;
EnvioStream.Free;
EnvioStream := nil;
end;
尽管如此,如果切换到所有发送串数字和字母,然后在客户端加载的StringList通常在Android上,如果我只放一个UTF8字符就会崩溃。如何解决这个问题?
编辑:消息是“目标多字节代码页中不存在Unicode字符的映射”。
https://stackoverflow.com/questions/23810909/mobile-application-error-when-loading-from-stream 我的坏。它是重复的, 解决方法是更改以下行:'Enviar.SaveToStream(EnvioStream,TEncoding.UTF8);' –