从DataGrid保存时,斯堪的纳维亚字符会搞砸

时间:2013-01-11 21:56:24

标签: utf-8 character-encoding dojox.grid.datagrid xpages-extlib non-english

我正在处理通过xe:djxDataGrid加载和保存数据的xe:restService。它从Domino文档加载数据,此时所有斯堪的纳维亚字符如ä和ö看起来都不错。

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

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

  • Internet站点文档:使用UTF-8输出 - 是
  • Db属性:编码 - utf-8
  • 表格:字符集 - Unicode(UTF-8)

页面的响应标题包含以下行:Content-Type:text/html;charset=utf-8

我也尝试将charset更改为ISO-8559-1,但这并没有帮助。我已经尝试将REST控件的 computeWithForm 属性设置为true,以查看是否使它使用表单字符集但它没有效果。

Firefox (17.0.1)中,一切正常!问题至少出现在 Chrome IE9 中。

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

HTML标记如下所示:

Chrome:<html lang="fi"> Firefox:<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中设置charset的方法。

编辑4

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

感谢,

  • PANU

2 个答案:

答案 0 :(得分: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);
        }
    }
)

答案 1 :(得分:0)

我应该可以通过覆盖Dojo charset并修改HTTP标头来修改xhrPut

以下是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

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