2016-09-03 12 views
0

UTF-8ユニコード文字列を正しく表示するための正しい方法を教えてください。UTF-8文字列はバックスラッシュとして表示され、その後にデルファイベルリンでは「 0646」という数字が表示されますか?

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

私はDelphiについてはほとんど分かりませんが、コード例が正しいことをご存じですか?構文エラーがあるように見えるので、あなたの例は[mcve]でなければなりません。 – Carpetsmoker

+1

コードサンプルが無効です。それはコンパイルされません。これもUTF-8文字列ではなく、エンコードされたUTF-8文字列です。ベルリンはあなたがメモに追加しているものがあなたがそれを提供している正確な価値以外であることを知る方法がありません。なぜあなたはそれがそれとは異なった振る舞いをすると思いますか?文字列 '' \ u062a \ u0637 \ u0628 \ u064a \ u0640 \ u0640 \ u0640 \ u0642 \ u062f \ u0640 \ u0640 \ u0640 \ u0627 \ u0621 ''をメモに入れるように指示していますあなたのコードが何をすべきかを正確に示しています。 –

+0

実際には、エンコードされているUnicode文字列に関係なく、エンコードされたUnicode文字列です。 '\ uxxxx'は、UTF-8やUTF-16やUTF-32としてデコードできます。 –

答えて

6

文字列はUTF-8ではありません。たとえそれがUTF-8を使用してHTTP経由で転送されたとしても、Text文字列のUTF-8ではなく、代わりにUTF-16です。その内容はJSONエンコードされたオブジェクトで、エスケープシーケンス表記を使用してエンコードされたUnicode文字を含むdisplayNameフィールドを持っています(これはJSONでは厳密には必須ではありませんが、サポートされています)。各\uXXXXは、UTF-16コードユニット値のエスケープされたテキスト表現です(\u062aはUnicodeコードポイント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値(displayname)に対してアラビア語のテキストが表示されます。しかし、私の究極の目的は、後で処理するためにテキストファイルに格納するために、返されたWHOLEを 'Text'という変数/文字列で取得することです。私はそれがデルファイで行うことができるかどうかはわかりませんか? –

関連する問題