3

我使用Sencha TouchOpenLayers创建了一个小型测试页面,并且正在从GeoServer接收 WMS/WFS 数据。

我已将 HTML 页面上的编码设置为 UTF-8:

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

我使用以下语句从我的 GeoServer 中提取一些 WFS 数据:

var post = new OpenLayers.Request.POST({
    url: 'dataprovider.ashx',
    data: ...,
    headers: {
        "Content-Type": "text/xml;charset=utf-8"
    },
    callback: function (response) {
        ...
    },
});

我认为这应该给我编码为 UTF-8 的请求数据。

使用 iPhone 4 (IOS 4) 和三星 Galaxy Tab 10.1 (Android 3.1) 可以正常工作。

我的问题是:使用带有 Android 2.2 的设备,我以不同的编码获取数据。

我希望收到的其中一个词是Høj,但我收到Høj(ANSI)。

使用 FireFox 和 Chrome 我知道如何调试来自 GeoServer 的响应,但我不知道如何调试手机或平板电脑。

为什么 Android 2.2 上的编码错误?

更新:问题似乎与使用 Android 2.2 的设备有关。HTC Legend、三星 Galaxy SII 和三星 Galaxy Tab 7 都存在问题 - 均运行 Android 2.2。

4

1 回答 1

2

我在使用 GeoServer、openLayers 和 Android 浏览器(Android 2.2)时遇到了完全相同的问题。

我进行了一些研究,寻找存在问题的地方。总而言之,我使用了 XMLHttpRequest.js。在这个文件中,openLayers 正在创建 XMLHttpRequest 对象,发出请求并接收响应。我还发现在这个阶段已经收到的数据有编码问题。

我还使用wireshark 嗅探通信,以确保我发送的数据采用正确的编码(utf-8)。我转储了这些数据并发现它是正确的 utf-8 数据。但有趣的是,当我尝试使用 iso-8859-1 显示我的 utf-8 数据时,我收到了与 Android 浏览器中完全相同的输出。

我的结论: 在 android 2.2 Web 浏览器中,XMLHttpRequest 对象总是读取假设 iso-8859-1 编码的数据。

我的解决方案: 您必须自己修复字符串。首先,您必须制作必须记住的地图,例如“ø”是“ø”。然后当你发现“ø”序列时逐个字符地检查,用“ø”代替它。这是示例代码:

goodString = "";
for( i = 0; i < wrongString.length; i++) {
    var w = wrongString.charCodeAt(i);
    var c = wrongString.charAt(i);
    if(w == "Ã".charCodeAt(0) {
        w2 = wrongString.charCodeAt(++i);
        if(w2 == "¸".charCodeAt(0))
            c = 'ø';
    }
    goodString += c;
}
于 2012-03-02T10:30:04.637 回答