2016-09-03 2 views
0

UTF-8 유니 코드 문자열을 올바르게 표시하는 올바른 방법을 알려줄 수 있습니까?Delphi Berlin에서 UTF-8 문자열 뒤에 백 슬래시와 " 0646"이 표시됩니까?

웹 서비스에서 텍스트 문자열을받는 프로 시저를 호출하고 있습니다. 이 절차는 문자열이 완벽하게 수신되면 잘 동작합니다. 문자열이 UTF-8 텍스트가 포함되어 있기 때문에, 그것은

{"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; 
+0

나는 델파이에 대해 거의 알지 못하지만, 코드 예제가 정확한지 확신 할 수 있습니까? 구문 오류가있는 것처럼 보이므로 예제는 [mcve] 여야합니다. – Carpetsmoker

+1

코드 샘플이 유효하지 않습니다. 컴파일되지 않습니다. UTF-8 문자열도 아닙니다. 인코딩 된 UTF-8 문자열입니다. 베를린은 귀하가 메모에 추가하는 내용이 귀하가 제공하는 정확한 가치 이외의 것이라는 것을 알 수있는 방법이 없습니다. 왜 당신은 그것이 다른 것과 다르게 행동 할 것이라고 기대합니까? ''\ u062a \ u0637 \ u0628 \ u064a \ u0640 \ u0640 \ u0640 \ u0642 \ u062f \ u0640 \ u0640 \ u0640 \ u0640 \ u0627 \ u0621 ''문자열을 메모에 넣으라고 말하고 있습니다. 컨트롤을 제공하며, 코드가 수행하는 작업을 정확하게 수행합니다. –

+0

실제로 인코딩 된 유니 코드 문자열은 인코딩 된 유니 코드 문자열입니다. '\ uxxxx'는 UTF-8이나 UTF-16 또는 UTF-32로 디코딩 될 수 있습니다. –

답변

6

문자열은 UTF-8이 아닙니다. UTF-8을 사용하여 HTTP를 통해 전송 된 경우에도 Text 문자열에 더 이상 UTF-8이 아니며 대신 UTF-16 문자열입니다. 그 내용은 JSON 인코딩 된 개체이며, 이스케이프 시퀀스 표기법을 사용하여 인코딩 된 유니 코드 문자를 포함하는 displayName 필드를 포함합니다 (JSON에서 반드시 필요하지는 않지만 그럼에도 불구하고 지원됩니다). 각 \uXXXX은 UTF-16 코드 단위 값 (UTF-16 코드 단위 U+062A ARABIC LETTER TEH, \u0637U+0637 ARABIC LETTER TAH 등)의 이스케이프 된 텍스트 표현입니다.

델파이에는 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; 
+0

제안 된대로 코드를 수정했지만 항상 모듈 GNIP_Consumer.exe에서 주소 005F1060에 액세스 위반이 발생했습니다. 주소 00000008 읽기 –

+0

ParseJSONValue()는 구문 분석이 실패 할 경우 nil 포인터를 반환합니다. 이를 반영하기 위해 본보기를 업데이트했습니다. –

+1

수정 된 코드가 문제를 해결했으며 지정된 JSON 값 (표시 이름)에 대해 아랍어 텍스트가 표시됩니다. 그러나 궁극적 인 목표는 후속 처리를 위해 텍스트 파일에 저장하기 위해 하나의 변수/문자열에서 WHOLE이 반환 한 'Text'를 검색하는 것입니다. 그게 델파이에서 할 수 있는지 모르겠다 ??? –