2

要約すると、「ñ」に変換される「\ u00c3\u00b1」などのUnicode文字を含むJSON形式のデータを含むHTTPWeb応答を取得します。代わりに、これらの文字は、私が使用しているJSONパーサーによって「ñ」に変換されます。私が探している動作は、それらの文字が「ñ」に変換されることです。

次のコードを取得して実行します...

string nWithAccent = "\u00c3\u00b1";

Encoding iso = Encoding.GetEncoding("iso8859-1");
byte[] isoBytes = iso.GetBytes(nWithAccent);

nWithAccent = Encoding.UTF8.GetString(isoBytes);

nWithAccentは「ñ」を出力します。これが私が探している結果です。上記のコードを取得し、上記と同じ文字を含む以下の「response_body」変数で使用しましたが(Visual Studio 2008 Text Analyzerを使用して確認できたものから)、同じ結果は得られませんでした...何もしません文字「\u00c3\u00b1」。

私のアプリケーションでは、JSON形式でデータを取得する外部システムに対して次のコードを実行します。Visual Studioのテキストアナラ​​イザーを使用して「response_body」変数を調べると、ñの代わりに「\ u00c3\u00b1」が表示されます。たとえば、「niño」という単語は、テキストアナラ​​イザでは「ni \ u00c3\u00b1o」と表示されます。

using (HttpWResponse = (HttpWebResponse)this.HttpWRequest.GetResponse())
{
    using (StreamReader reader = new StreamReader(HttpWResponse.GetResponseStream(), Encoding.UTF8))
    {
        // token will expire 60 min from now.
        this.TimeTillTokenExpiration = DateTime.Now.AddMinutes(60);

        // read response data
        response_body = reader.ReadToEnd();
    }
}    

次に、「\ u00c3」を「Ã」に、「\ u00b1」を「±」に置き換え、最終結果を「ñ」ではなく「ñ」にするオープンソースのJSONパーサーを使用します。JSONパーサーに何か問題がありますか、それとも応答ストリームに間違ったエンコーディングを適用していますか?応答のヘッダーは、文字セットがUTF-8であることを示しています。返信ありがとうございます!

4

3 に答える 3

1

交換

new StreamReader(HttpWResponse.GetResponseStream(), Encoding.UTF8))

new StreamReader(HttpWResponse.GetResponseStream(), Encoding.GetEncoding("iso8859-1")))
于 2011-12-13T08:00:32.590 に答える
1

受信しているJSON応答が無効です。"\u00c3\u00b1"の正しいエンコーディングではありませんñ

代わりに、それは一種の二重エンコーディングです。最初にUTF-8バイトシーケンスとしてエンコードされ、次に128を超えるバイトがシーケンスでエスケープされてい\uます。

とにかくJSON応答は通常UTF-8であるため、の2バイトシーケンスをエスケープする必要はありませんñ。エスケープを使用する場合は、2バイトのシーケンスではなく、単一のUnicode文字自体に適用する必要があります。その場合、結果はになり"\u00f1"ます。

次のJSONデータを貼り付けることで、オンラインJSONバリデーター(JSONLintJSON形式など)でテストできます。

{
    "unescaped": "ñ",
    "escaped": "\u00f1",
    "wrong": "\u00c3\u00b1"
}
于 2011-12-13T08:30:46.447 に答える
0

この文字列をJSONパーサーに渡すとどうなりますか?

string s = "\\u00c3\\u00b1";

私はあなたが得るだろうと思う"ñ"

文字列内の文字をUTF-8バイトであるかのように解釈するようにJSONパーサーに指示する方法はありますか?

おそらく、応答ストリームから生のバイトを読み取り、それをJSONパーサーに渡す方がよいでしょう。

問題は、生のバイトをエンコードされた文字を含む文字列に変換していることだと思います。JSONパーサーは、「\ u00c3\u00b1」を単一のUTF-8文字に変換するか2文字に変換するかを認識しません。

于 2011-12-13T08:34:02.210 に答える