0

我正在开发一个xe:djxDataGrid通过xe:restService. 它从 Domino 文档加载数据,此时所有斯堪的纳维亚字符(如 ä 和 ö)看起来都正常。

但是如果数据被修改并保存回服务器,ä 会变成 ä 并且 ö 会变成 ö。我认为这是因为数据是 UTF-8 编码的,但在某些时候会被解释为 ISO-8559-1。

我正在尝试在任何地方使用 UTF-8:

  • Internet 站点文档:使用 UTF-8 进行输出 - 是
  • 数据库属性:编码 - utf-8
  • 形式:字符集 - Unicode (UTF-8)

页面的响应头有这一行:Content-Type:text/html;charset=utf-8

我还尝试将字符集更改为 ISO-8559-1,但这无济于事。我尝试将 REST 控件的computeWithForm属性设置为 true 以查看是否使其使用表单字符集,但它没有效果。

Firefox (17.0.1) 中一切正常!该问题至少出现在ChromeIE9中。

因为它是特定于浏览器的,所以我认为当 Dojo 将数据发送到 REST 服务时它会中断。但我还没有看到专门告诉 Dojo 使用 UTF-8 的方法。

HTML 标记如下所示:

铬:<html lang="fi"> 火狐:<html class="dj_gecko dj_contentbox" lang="fi">

djConfig 是这样的:djConfig="locale: 'fi-fi'.

Domino 版本是 8.5.3FP3,ExtLib 日期是 20121217。

不幸的是,我不能强迫用户只使用 Firefox。任何想法如何解决这一问题?

编辑 1

ExtLib 演示应用程序中出现了同样的问题:xpagesext.nsf/REST_DojoGrid.xsp 和 xpagesext.nsf/REST_DojoGridJsonRest.xsp。

编辑 2

作为一种解决方法,我可以在表单上的字段输入翻译中执行此操作:

@ReplaceSubstring(@ThisValue; "ä":"ö"; "ä":"ö");

这在我在 REST 控件中启用computeWithForm时有效。我需要包括所有可能使用的非英语字符。还是有一种通用的方法来转换所有?

编辑 3

根据@Esailija 的建议,我检查了将数据保存到服务器的 HTTP PUT 请求。这次我用同样有问题的Opera 12.12 进行测试。PUT 请求的内容类型为:

Content-Type: application/json

使用 Firefox 是:

Content-Type:application/json; charset=UTF-8

这解释了问题,但如何解决呢?据我了解,问题出在dojox.grid.DataGrid (1.6) 控件上,它没有在 PUT 请求中设置字符集。Firefox 似乎会自动设置它。或者实际上是在 ExtLib DataGrid 中未能在 Dojo 控件中设置字符集?我还没有找到在 DataGrid 中设置字符集的方法。

编辑 4

尝试将REST 控件中的contentType属性从更改application/jsonapplication/json; charset=UTF-8。这没有帮助,PUT 的内容类型仍然是application/json.

谢谢,

  • 帕努
4

2 回答 2

1

我修改了代码,它的工作

dojo.addOnLoad( 
    function() {
        if( !(dojo._xhrPost )) {
            dojo._xhrPost = dojo.xhrPost;
        }

        dojo.xhrPost = function (args) {
            if ( args.headers && ( args.headers["Content-Type"] == "application/json" ) ) {
                args.headers["Content-Type"] = "application/json;charset=UTF-8";
            }
            return dojo._xhrPost(args);
        }
    }
)
于 2013-12-30T07:53:53.483 回答
0

我应该能够charset通过覆盖 DojoxhrPut和修改 HTTP 标头来修改。

以下是 Sven Hasselbach 的做法,但需要对其进行修改,这样我们就不会覆盖现有的标头(因为它们被 REST 服务使用)并且只需添加/修改它们:

/**
 * Cache Prevention for Dojo xhr requests
 *
 * Adds no-cache header and enables dojo's preventCache feature
 * for every dojo xhr call. This prevents the caching of partial
 * refreshs.
 *
 * @author Sven Hasselbach
 * @version 0.3
 *
 **/
dojo.addOnLoad(
    function(){
        if( !dojo._xhr )
        dojo._xhr = dojo.xhr;

        dojo.xhr = function(){        
            try{
                var args = arguments[1];   
                args["preventCache"] = true;
                args["headers"] = { "cache-control": "no-cache" };
                arguments[1] = args;
          }catch(e){}

          dojo._xhr( arguments[0], arguments[1], arguments[2] );
        }
    }
)

http://openntf.org/XSnippets.nsf/snippet.xsp?id=cache-prevention-for-dojo-xhr-requests

我已经有了解决方法,但会在某个时候尝试一下。

于 2013-01-28T13:35:17.203 回答