Скандинавските символи се объркват, когато се записват от DataGrid

Работя върху xe:djxDataGrid, който зарежда и записва данни чрез xe:restService. Той зарежда данните от документите на Domino и в този момент всички скандинавски знаци като ä и ö изглеждат добре.

Но ако данните са променени и записани обратно на сървъра, ä се превръща в ä и ö се превръща в ö. Мисля, че това е така, защото данните са UTF-8 кодирани, но в даден момент се интерпретират като ISO-8559-1.

Опитвам се да използвам UTF-8 навсякъде:

  • Документ на интернет сайта: Използвайте UTF-8 за изход - Да
  • Свойства на Db: Кодиране - utf-8
  • Форма: Набор от знаци - Unicode (UTF-8)

Заглавката на отговора на страницата има този ред: Content-Type:text/html;charset=utf-8

Също така се опитах да променя набора от знаци на ISO-8559-1 навсякъде, но това не помага. Опитах се да настроя свойството computeWithForm на контролата REST на 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; "ä":"ö"; "ä":"ö");

Това работи, когато активирам computeWithForm в контрола REST. Трябва да включа всички неанглийски символи, които вероятно ще бъдат използвани. Или има общ начин за конвертиране на всички?

редактиране 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

Опитах да променя свойството contentType в REST контрола от application/json на application/json; charset=UTF-8. Това не помогна и типът съдържание на PUT все още е application/json.

Благодаря,

  • Пану

person Panu Haaramo    schedule 11.01.2013    source източник
comment
Тъй като работи във firefox - можете ли да отидете в Меню -> Уеб програмист -> Кодиране на знаци и да видите какво кодиране е избрано, когато разглеждате страницата, тъй като очевидно това е правилното кодиране.   -  person Esailija    schedule 12.01.2013
comment
@Esailija, който показва Unicode (UTF-8), както бих очаквал. IE9 показва същото.   -  person Panu Haaramo    schedule 12.01.2013
comment
Е, тогава няма смисъл единият да показва ö на страницата, а другият да показва ö..   -  person Esailija    schedule 12.01.2013
comment
@Esailija всички браузъри показват едно и също. Объркването на знаците възниква, когато данните се изпращат на сървъра. Запазването от друг, различен от Firefox, променя знаците.   -  person Panu Haaramo    schedule 12.01.2013
comment
В такъв случай трябва да започнете, като разгледате заглавките на http заявката за тип съдържание и данните от тялото на заявката, използвани от браузърите, когато изпращат данните   -  person Esailija    schedule 12.01.2013


Отговори (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);
        }
    }
)
person Roman    schedule 30.12.2013

Трябва да мога да модифицирам charset, като заменя 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] );
        }
    }
)

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

Вече имам заобиколното решение, но ще го пробвам в даден момент.

person Panu Haaramo    schedule 28.01.2013