Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Utf 8 从DataGrid保存时,斯堪的纳维亚字符会变得一团糟_Utf 8_Character Encoding_Dojox.grid.datagrid_Xpages Extlib_Non English - Fatal编程技术网

Utf 8 从DataGrid保存时,斯堪的纳维亚字符会变得一团糟

Utf 8 从DataGrid保存时,斯堪的纳维亚字符会变得一团糟,utf-8,character-encoding,dojox.grid.datagrid,xpages-extlib,non-english,Utf 8,Character Encoding,Dojox.grid.datagrid,Xpages Extlib,Non English,我正在开发一个xe:djxDataGrid,它通过xe:restService加载和保存数据。它从Domino文档加载数据,此时所有斯堪的纳维亚字符(如ä和ö)看起来都正常 但是,如果数据被修改并保存回服务器,则ä将变为Ã,ö将变为Ã。我认为这是因为数据是UTF-8编码的,但在某一点上被解释为ISO-8559-1 我尝试在任何地方使用UTF-8: 互联网站点文档:使用UTF-8进行输出-是 数据库属性:编码-utf-8 格式:字符集-Unicode(UTF-8) 页面的响应标题有以下行:内容

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

但是,如果数据被修改并保存回服务器,则ä将变为Ã,ö将变为Ã。我认为这是因为数据是UTF-8编码的,但在某一点上被解释为ISO-8559-1

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

  • 互联网站点文档:使用UTF-8进行输出-是
  • 数据库属性:编码-utf-8
  • 格式:字符集-Unicode(UTF-8)
页面的响应标题有以下行:
内容类型:text/html;字符集=utf-8

我还尝试在任何地方将字符集更改为ISO-8559-1,但这没有帮助。我尝试将REST控件的computeWithForm属性设置为true,以查看它是否使用form字符集,但没有效果

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

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

HTML标记如下所示:

Chrome:
Firefox:

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

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

当我在REST控件中启用computeWithForm时,这就可以工作了。我需要包含所有可能使用的非英语字符。或者是否有一种通用方法来转换所有字符

编辑3

正如@Esailija所建议的,我检查了将数据保存到服务器的HTTP PUT请求。这次我使用Opera12.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/json
更改为
application/json;charset=UTF-8
。这没有帮助,PUT的内容类型仍然是
application/json

谢谢

  • 帕努

我应该能够通过覆盖Dojo
xhrPut
和修改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] );
        }
    }
)


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

我修改了代码,这是有效的

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);
        }
    }
)

由于它在firefox中工作-当您查看页面时,是否可以转到“菜单->Web开发者->字符编码”并查看所选择的编码,显然这是正确的编码。@Esailija,显示“Unicode(UTF-8)”“如我所料。IE9显示的是相同的。那么,一个在页面上显示
Ã
,另一个显示
ö
,这是毫无意义的。所有浏览器都显示相同的。将数据提交到服务器时,会出现字符混乱。从非Firefox保存会更改字符。在这种情况下,您应该首先查看http请求头的内容类型以及浏览器发送数据时使用的请求正文数据
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);
        }
    }
)