4

JSONPを介してデータを返すC#4.0の小さなWebサービスがあります。私が抱えている問題は、ドイツ語のウムラウト(ä、ö、ü)のような非ASCII文字が、クライアントに到着したときにスクランブルされることです。次の簡略化されたコードは、これを示しています。

// The interface
[OperationContract]
[WebGet( ResponseFormat = WebMessageFormat.Json )]
string GetTestString();

//...

// The implementation
public string GetTestString()
{
    return "String with some German characters: äöüß";
}

ここで、URLを入力してFirefoxからWebメソッドにアクセスするとhttp://localhost:31843/TestWebService/GetTestString、正しい結果が得られます。

"String with some German characters: äöüß"

ただし、JSONPが行うcallbackURL()でパラメーターを指定すると、スクランブルされた結果が得られます。http://localhost:31843/TestWebService/GetTestString?callback=Test

Test("String with some German characters: äöüß");

webHttpBinding.CrossDomainScriptAccessEnabled = true;JSONPシリアライザーは、コードで設定してアクティブ化したMicrosoft.NET4.0フレームワークのシリアライザーです。そのシリアライザーの文字エンコードに影響を与える方法は見つかりませんでした。あなたはなにか考えはありますか?

別のヒント:スクランブルされた文字を含むJSONP文字列のWebリクエストの後、Firebugはコンソールに次のエラーを表示します。

「プレーンテキストドキュメントの文字エンコードが宣言されていません。ドキュメントにUS-ASCII範囲外の文字が含まれている場合、一部のブラウザ構成でテキストが文字化けしてレンダリングされます。ファイルの文字エンコードは転送で宣言する必要があります。プロトコルまたはファイルは、エンコーディング署名としてバイトオーダーマークを使用する必要があります。」

明らかにこれが問題のようです。しかし、問題は、正しいエンコーディングを構成する方法(そして、なぜデフォルトでUTF8ではないのか)です。

アップデート:

Microsoft.NETDataContractJsonSerializerにはバグがあると思います。JSONの最初のケースでは、次のHTTPヘッダーを送信します。

Content-Type: application/json; charset=utf-8

callbackURLパラメータを指定してJSONPを使用すると、次の情報が送信されます。

Content-Type: application/x-javascript

したがって、文字エンコードは指定されず、文字設定の決定はブラウザに任されます。Content-Typeインターネットでの調査の結果、DataContractJsonSerializerに適切な文字セットを使用してHTTPヘッダーを送信させる(簡単な)方法はないと確信しています。

4

1 に答える 1

3

私は今、これに対する非常に単純な解決策を見つけました-多分少し人工的な-問題。

説明:JavaScriptフレームワークを使用してスマートフォン用のアプリを開発しているため、ネイティブアプリではなく、スマートフォンのブラウザーエンジンで実行されます。このため、すべてのWebコンテンツ(HTML、JavaScript、CSSファイルなど)は、Webサーバーからリモートではなく、ローカルにロードされます。HTTPがまったくないため、文字セットを含む適切なContent-TypeHTTPヘッダーがないのはそのためです。アプリのメインページ(唯一のページ)であるindex.htmlファイルにも、文字セットが指定されていませんでした。そのため、ブラウザは、残念ながらUTF-8ではなくデフォルトの文字セットを想定していました。

したがって、私にとっての簡単な解決策は、次の行を追加してindex.htmlの文字セットを指定することでした。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

これにより、JSONP HTTP応答で文字セットを明示的に指定しなくても、埋め込まれたJSONPデータが正しく表示されるようになりました。

もちろん、上記の私の質問で述べたように、これはFirefoxの誤った表示を解決しません。ただし、スマートフォンのブラウザに正しく表示する必要があるだけなので、これは問題ではありません。

于 2012-08-22T07:45:45.947 に答える