// The interface [OperationContract] [WebGet( ResponseFormat = WebMessageFormat.Json )] string GetTestString(); //... // The implementation public string GetTestString() { return "String with some German characters: äöüß"; }
现在,如果我通过输入URL http:// localhost:31843 / TestWebService / GetTestString通过Firefox访问Web方法,我会得到正确的结果:
"String with some German characters: äöüß"
但是,如果我在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时,它会发送:
Content-Type: application/x-javascript
因此,不指定字符编码,将字符集的决定留给浏览器.在互联网上进行一些研究后,我确信没有(简单)方法强制DataContractJsonSerializer发送带有正确字符集的Content-Type HTTP标头.
解决方法
说明:我正在开发一个带有JavaScript框架的智能手机应用程序,因此它不是原生应用程序,而是在智能手机的浏览器引擎中运行.因此,所有Web内容(HTML,JavaScript,CSS文件等)都在本地加载,而不是从Web服务器远程加载.这就是为什么没有适当的带有字符集的Content-Type HTTP标头,因为根本没有HTTP.在index.html文件中,它是应用程序的主页面(唯一的),也没有指定charset.所以浏览器假设了一些默认字符集,遗憾的是不是UTF-8.
所以对我来说简单的解决方案是通过添加以下行来指定index.html中的字符集:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
这样,嵌入式JSONP数据现在也可以正确显示,而不需要JSONP HTTP响应显式指定其字符集.
当然,这不能解决Firefox中不正确的显示问题,如上面的问题所述.但这并不重要,因为它只需要在智能手机的浏览器上正确显示.