如何在 Delphi 中转发 REST 响应中带有特殊字符的文本?

How to forward a text with special characters in REST responses, in Delphi?

请帮忙。我正在尝试学习 REST 概念并使用 Delphi 和 REST 对象制作第一个程序。我遇到了一个我不知道如何解决的问题。在数据库中,我用我的母语(波斯尼亚语)中的特殊字符进行了测试:č、ć、đ、š、ž。当我通过 GET 方法传递此文本时,在表单上的对象中解析和显示此文本的对象将这些字符显示为“?”、“æ”、“æè”等。 我研究并尝试解决问题,但没有成功。我尝试使用 Utf8ToAnsi 函数并在 RESTClient、RESTRequest 和 RESTResponce 对象参数中使用 iso-8859-2 而不是 UTF-8。 请寻求有关如何解决或调查此问题的帮助、指导或建议。

服务器端源代码:

procedure TWebModule1.UsersGet(Request: TWebRequest; Response: TWebResponse);
var
  a: TJSONArray;
  o: TJSONObject;
  i: Integer;
  Q1: TADOQuery;
begin
  Q1:=TADOQuery.Create(nil);
  Q1.Connection:= BasicDBConn.Konekcija;
  with Q1 do
  begin
    Active:=False;
    SQL.Clear;
    SQL.Add('Select USER_ID, USER_NAME, ROLE_NAME  from USERS, ROLES  ' +
      ' where USERS.ROLE_ID=ROLES.ROLE_ID ');
    Active:= True;
  end;
  a := TJSONArray.Create;

  if Q1.RecordCount > 0 then
  begin
    for i:=1 to Q1.RecordCount do
    begin
      o := TJSONObject.Create;
      o.AddPair('USER_ID', Q1.Fields.Fields[0].Value);
      o.AddPair('USER_NAME', Q1.Fields.Fields[1].Value);
      o.AddPair('ROLE_NAME', Q1.Fields.Fields[2].Value);
      Q1.Next;
      a.AddElement(o);
    end;
  end;

  Response.ContentType := 'application/json';
  Response.Content := a.ToString;
  a.DisposeOf;
  Q1.Free;
end;

在客户端:

procedure TGlavna.Button1Click(Sender: TObject);
begin
  RESTRequest.Resource := 'Users';
  RESTRequest.Method   := TRESTRequestMethod.rmGet;
  RESTRequest.Response := RESTResponse;

  RESTRequest.Execute;

  if assigned(fJSONArray) then fJSONArray.DisposeOf;
  fJSONArray := TJSONObject.ParseJSONValue(RESTResponse.Content) as TJSONArray;

  if RESTResponse.Content.IsEmpty then Application.MessageBox('Empty', 'Information', MB_OK)
    else Memo1.Lines.Add(RESTResponse.Content);
end;

这是数据库中数据的样子

USER_ID USER_NAME ROLE_ID u1 测试用户 2
u2 T_č_ć_š_đ_ž 1
u3 t_Č_Ć_Ž_Đ_Š 1
u4 布拉迪奇·凯南 1

在网络浏览器中,响应数据为:

[{"USER_ID":"u1","USER_NAME":"测试用户","ROLE_ID":"2"},{"USER_ID":"u3","USER_NAME":"t_È_Æ_Ž_Ð_Š","ROLE_ID":"1"},{"USER_ID":"u4","USER_NAME":"Bradiæ Kenan","ROLE_ID":"1"},{"USER_ID":"u2","USER_NAME":"T_è_æ_š_ð_ž","ROLE_ID":"1"}]

Headers in web browser:
General:
    Request URL: http://localhost:8080/Users
    Request Method: GET
    Status Code: 200 OK
    Remote Address: [::1]:8080
    Referrer Policy: strict-origin-when-cross-origin
Response Headers:
    Connection: close
    Content-Length: 228
    Content-Type: application/json; charset=ISO-8859-1
    Date: Mon, 27 Dec 2021 17:07:54 GMT
Request Headers:
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en-US,en;q=0.9
    Cache-Control: max-age=0
    Connection: keep-alive
    Host: localhost:8080
    sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

谢谢...

HTTP 响应包含这一行:

Content-Type: application/json; charset=ISO-8859-1

因此客户端处理将响应内容解释为 ISO-85591 编码而不是 UTF-8。 您的服务器端代码包含此行:

Response.ContentType := 'application/json';

您的服务器端代码应该清除 charset=ISO-85591 部分。