我在 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
http://localhost:31843/TestWebService/GetTestString
访问 Web 方法我得到正确的结果:"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 范围之外的字符,则在某些浏览器配置中,文档将呈现乱码。文件的字符编码需要在传输中声明协议(protocol)或文件需要使用字节顺序标记作为编码签名。”
显然,这似乎是问题所在。但问题是,如何配置正确的编码(为什么默认不是UTF8)?
更新:
我认为 Microsoft .NET DataContractJsonSerializer 有一个错误。在 JSON 的第一种情况下,它发送以下 HTTP header :
Content-Type: application/json; charset=utf-8
通过指定
callback
使用 JSONP 时URL 参数,它发送:Content-Type: application/x-javascript
因此没有指定字符编码,将字符集的决定留给浏览器。在互联网上进行一些研究后,我确信没有(简单的)方法可以强制 DataContractJsonSerializer 发送
Content-Type
具有正确字符集的 HTTP header 。
最佳答案
我现在找到了一个非常简单的解决方案 - 可能有点人为 - 问题。
说明:我正在使用 JavaScript 框架为智能手机开发一个应用程序,所以它不是原生应用程序,而是在智能手机的浏览器引擎中运行。因此,所有 Web 内容(HTML、JavaScript、CSS 文件等)都在本地加载,而不是从 Web 服务器远程加载。这就是为什么没有合适的Content-Type
带有字符集的 HTTP header ,因为根本没有 HTTP。在 index.html 文件中,它是应用程序的主页(唯一的),也没有指定字符集。所以浏览器假定了一些默认字符集,不幸的是不是 UTF-8。
所以对我来说简单的解决方案是通过添加以下行来指定 index.html 中的字符集:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
这样,嵌入的 JSONP 数据现在也可以正确显示,而无需明确指定 JSONP HTTP 响应的字符集。
当然,这并不能解决 Firefox 中的错误显示,如我上面的问题所述。但这并不重要,因为它只需要在智能手机的浏览器上正确显示。
关于.net - 带有加扰的非 ASCII 字符的 JSONP 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12057818/