我在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: äöüß";
}
现在,如果我通过输入网址http://localhost:31843/TestWebService/GetTestString
通过Firefox访问网络方法,我会得到正确的结果:
"String with some German characters: äöüß"
但是,如果我在URL(callback
)中指定http://localhost:31843/TestWebService/GetTestString?callback=Test
参数,这是JSONP的作用,我会得到一个混乱的结果:
Test("String with some German characters: äöüß");
JSONP序列化程序是Microsoft .NET 4.0框架的序列化程序,我通过在代码中设置webHttpBinding.CrossDomainScriptAccessEnabled = true;
来激活它。
我没有找到任何方法来影响该序列化程序的字符编码。你有什么想法吗?
另一个提示:在带有加扰字符的JSONP字符串的Web请求之后,Firebug在控制台上显示以下错误:
“未声明纯文本文档的字符编码。如果文档包含来自US-ASCII范围之外的字符,则文档将在某些浏览器配置中使用乱码文本呈现。文件的字符编码需要要在传输协议或文件中声明需要使用字节顺序标记作为编码签名。“
显然这似乎是个问题。但问题是,如何配置正确的编码(为什么默认情况下不是UTF8)?
我认为Microsoft .NET DataContractJsonSerializer有一个错误。在使用JSON的第一种情况下,它发送以下HTTP标头:
Content-Type: application/json; charset=utf-8
通过指定callback
URL参数来使用JSONP时,它会发送:
Content-Type: application/x-javascript
因此未指定字符编码,将字符集的决定留给浏览器。在互联网上进行一些研究后,我确信没有(简单)方法强制DataContractJsonSerializer使用适当的字符集发送Content-Type
HTTP标头。
答案 0 :(得分:3)
我现在已经找到了一个非常简单的解决方案 - 可能有点人为 - 问题。
说明:我正在开发一个带有JavaScript框架的智能手机应用程序,所以它不是原生应用程序,而是在智能手机的浏览器引擎中运行。因此,所有Web内容(HTML,JavaScript,CSS文件等)都在本地加载,而不是从Web服务器远程加载。这就是为什么没有适当的Content-Type
HTTP标头和charset,因为根本没有HTTP。在index.html文件中,它是应用程序的主页面(唯一的),也没有指定charset。所以浏览器假设了一些默认的字符集,遗憾的是不是UTF-8。
因此,对我来说,简单的解决方案是通过添加以下行来指定index.html中的字符集:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
这样,嵌入式JSONP数据现在也可以正确显示,而不需要JSONP HTTP响应显式指定其字符集。
当然,这并不能解决Firefox中不正确的显示问题,如上面的问题所述。但这并不重要,因为它只需要在智能手机的浏览器上正确显示。