在德尔福柏林中,UTF-8字符串显示为反斜杠,后跟数字“\ 0646”?

时间:2016-09-03 00:34:23

标签: delphi unicode delphi-10.1-berlin

有些人能帮我正确显示UTF-8 unicode字符串吗?

我正在调用一个从Web服务接收文本字符串的过程。该过程工作正常,字符串被完美地接收。但是,由于字符串包含UTF-8文本,因此它将unicode字母显示为数字...

{"displayName":"\u062a\u0637\u0628\u064a\u0640\u0640\u0640\u0642 \u062f\u0639\u0640\u0640\u0640\u0640\u0640\u0627\u0621"

德尔福柏林应该支持UTF-8,但我没有使用哪种函数来编码UTF-8并显示文本(阿拉伯语文本)!!

Procedure TF_Main.GnipHTTPSTransfer(Sender: TObject; Direction: Integer; BytesTransferred: Int64; PercentDone: Integer; Text: String);
Begin
  Inc(Transfer_Count);
  L_Counter.Caption:=IntToStr(Transfer_Count);
  write(GNIP_Text_File, Text);
  M_Memo.Lines.Add(text);
End;

1 个答案:

答案 0 :(得分:6)

字符串不是UTF-8。即使它是使用UTF-8通过HTTP传输的,它在Text字符串中不再是UTF-8,而是UTF-16。它的内容是一个JSON编码的对象,它有一个displayName字段,包含使用转义序列表示法编码的Unicode字符(在JSON中不是严格要求的,但仍受支持)。每个\uXXXX都是UTF-16代码单元值的转义文本表示形式(\u062a是Unicode代码点U+062A ARABIC LETTER TEH\u0637U+0637 ARABIC LETTER TAH等。

Delphi有JSON framework,它将为您解码转义序列。例如:

uses
  ..., System.JSON;

procedure TF_Main.GnipHTTPSTransfer(Sender: TObject; Direction: Integer; BytesTransferred: Int64; PercentDone: Integer; Text: String);
var
  JsonVal: TJSONValue;
  JsonObj: TJSONObject;
begin
  Inc(Transfer_Count);
  L_Counter.Caption := IntToStr(Transfer_Count);
  write(GNIP_Text_File, Text);
  M_Memo.Lines.Add(Text);

  JsonVal := TJSONObject.ParseJSONValue(Text);
  if JsonVal <> nil then
  try
    JsonObj := JsonVal as TJSONObject;
    M_Memo.Lines.Add(JsonObj.Values['displayName'].Value); // تطبيـــق دعـــــاء
  finally
    JsonVal.Free;
  end;
end;