4

我在 C# 4.0 中有一个小型 Web 服务,它通过 JSONP 返回数据。我遇到的问题是非 ASCII 字符——比如德语变音符号(ä、ö、ü)——在到达客户端时会被打乱。以下简化代码说明了这一点:

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

//...

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

现在,如果我通过 Firefox 通过输入 URL 访问 Web 方法,http://localhost:31843/TestWebService/GetTestString我会得到正确的结果:

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

但是,如果我callback在 URL ( http://localhost:31843/TestWebService/GetTestString?callback=Test) 中指定参数,这就是 JSONP 所做的,我会得到一个打乱的结果:

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

JSONP 序列化程序是我通过webHttpBinding.CrossDomainScriptAccessEnabled = true;在我的代码中设置激活的 Microsoft .NET 4.0 框架的序列化程序。我没有找到任何方法来影响该序列化程序的字符编码。你有什么想法?

另一个提示:对带有乱码的 JSONP 字符串的 Web 请求后,Firebug 在控制台上显示以下错误:

“未声明纯文本文档的字符编码。如果文档包含 US-ASCII 范围之外的字符,则在某些浏览器配置中,文档将呈现乱码。文件的字符编码需要在传输中声明协议或文件需要使用字节顺序标记作为编码签名。”

显然,这似乎是问题所在。但问题是,如何配置正确的编码(为什么默认不是UTF8)?

更新:

我认为 Microsoft .NET DataContractJsonSerializer 有一个错误。在 JSON 的第一种情况下,它发送以下 HTTP 标头:

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

通过指定 URL 参数使用 JSONP 时callback,它会发送:

Content-Type: application/x-javascript

因此没有指定字符编码,将字符集的决定留给浏览器。在互联网上进行一些研究后,我确信没有(简单的)方法可以强制 DataContractJsonSerializer 发送Content-Type带有适当字符集的 HTTP 标头。

4

1 回答 1

3

我现在找到了一个非常简单的解决方案 - 可能有点人为 - 问题。

说明:我正在使用 JavaScript 框架为智能手机开发一个应用程序,所以它不是原生应用程序,而是在智能手机的浏览器引擎中运行。因此,所有 Web 内容(HTML、JavaScript、CSS 文件等)都在本地加载,而不是从 Web 服务器远程加载。这就是为什么没有Content-Type带有字符集的适当 HTTP 标头的原因,因为根本没有 HTTP。在 index.html 文件中,它是应用程序的主页(唯一的),也没有指定字符集。所以浏览器假定了一些默认字符集,不幸的是不是 UTF-8。

所以对我来说简单的解决方案是通过添加以下行来指定 index.html 中的字符集:

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

这样,嵌入的 JSONP 数据现在也可以正确显示,而无需明确指定 JSONP HTTP 响应的字符集。

当然,这并不能解决 Firefox 中的错误显示,如我上面的问题所述。但这并不重要,因为它只需要在智能手机的浏览器上正确显示。

于 2012-08-22T07:45:45.947 回答