带有加扰的非 ASCII 字符的 JSONP 字符串

Posted

技术标签:

【中文标题】带有加扰的非 ASCII 字符的 JSONP 字符串【英文标题】:JSONP string with scrambled non-ASCII characters 【发布时间】:2012-08-16 23:21:20 【问题描述】:

我在 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: äöüß"

但是,如果我在 URL (http://localhost:31843/TestWebService/GetTestString?callback=Test) 中指定 callback 参数,这就是 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 标头。

【问题讨论】:

【参考方案1】:

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

说明:我正在使用 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 中的错误显示问题,如我上面的问题所述。但这并不重要,因为它只需要在智能手机的浏览器上正确显示即可。

【讨论】:

以上是关于带有加扰的非 ASCII 字符的 JSONP 字符串的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题 C++ 实现字符串解密2022.11 Q4 新题

华为OD机试真题 Python 实现字符串解密2022.11 Q4 新题

华为OD机试真题 Python 实现字符串解密2022.11 Q4 新题

华为OD机试真题 Java 实现字符串解密2022.11 Q4 新题

华为OD机试真题 C++ 实现字符串解密2022.11 Q4 新题

华为OD机试真题 JavaScript 实现字符串解密2023 Q1 | 100分