Скандинавские символы путаются при сохранении из DataGrid

Я работаю над xe:djxDataGrid, который загружает и сохраняет данные через xe:restService. Он загружает данные из документов Domino, и в этот момент все скандинавские символы, такие как ä и ö, выглядят нормально.

Но если данные изменены и сохранены обратно на сервер, ä превращается в ä, а ö превращается в ö. Я думаю, это потому, что данные закодированы в UTF-8, но в какой-то момент интерпретируются как ISO-8559-1.

Я пытаюсь использовать UTF-8 везде:

  • Документ интернет-сайта: использовать кодировку UTF-8 для вывода — Да
  • Свойства БД: Кодировка — utf-8
  • Форма: Набор символов — Юникод (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

В качестве обходного пути я могу сделать это в поле Input Translations в форме:

@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.

Вот как это делает Свен Хассельбах, но это нужно изменить, чтобы мы не переопределяли существующие заголовки (поскольку они используются службой 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