我正在处理通过xe:djxDataGrid
加载和保存数据的xe:restService
。它从Domino文档加载数据,此时所有斯堪的纳维亚字符如ä和ö看起来都不错。
但是如果数据被修改并保存回服务器ä转向Ã,而ö转向¶。我认为这是因为数据是UTF-8编码的,但在某些时候被解释为ISO-8559-1。
我正试图在任何地方使用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
。
感谢,
答案 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
我已经有了解决方法,但在某些时候会试一试。