Unicode && AJAX
От: Mimi  
Дата: 20.10.06 08:30
Оценка:
Привет всем!
Очень нужна ваша помощь.
В общем, у меня, вопрос по AJAX-у, кто сталкивался с проблемой кодировки?
Ситуация такая:
у меня есть jsp страница, которая использует Ajax.
Charset для самой страницы — UTF-8 <%@ page contentType="text/html; charset=UTF-8" %>
в AJAX-овой функции я опять же ставлю чарсет в утф-8 http_request.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
И сервлет, который мне XML для response-а возвращает, у него ТОЖЕ инкодинг УТФ-8 <?xml version="1.0" encoding="utf-8"?>
Но каким-то хамским образом, AJAX умудряется наплевать на UTF, и показывает вот такую белиберду РљСѓРєСѓ
Обрыла все ресурсы по AJAX-у которые только нашла, и везде пишут что мол "достаточно поставить хэдер, что у тебя content-type UTF-8, и все должно работать"..
Ниченепонимаю.. я так и делаю, вроде, но нифига из того что кирилицей написано, не видно.
XML смотрела (вывела в файл логгером), все там нормально, русские буквы на месте.
По ходу, все буровит charset в самом http_request-е.
Кто из вас сталкивался с тиакой проблемой? Какие есть для этого решения?
Re: Unicode && AJAX
От: Yuri Khomich  
Дата: 20.10.06 09:07
Оценка:
Hello, Mimi!
You wrote on Fri, 20 Oct 2006 08:30:02 GMT:

M> Очень нужна ваша помощь.

M> В общем, у меня, вопрос по AJAX-у, кто сталкивался с проблемой
M> кодировки?
M> Ситуация такая:
M> у меня есть jsp страница, которая использует Ajax.
M> Charset для самой страницы — UTF-8 <%@ page
M> contentType="text/html; charset=UTF-8" %>
M> в AJAX-овой функции я опять же ставлю чарсет в утф-8
M> http_request.setRequestHeader("Content-Type", "text/xml;
M> charset=UTF-8");
M> И сервлет, который мне XML для response-а возвращает, у него ТОЖЕ
M> инкодинг УТФ-8 <?xml version="1.0" encoding="utf-8"?>
M> Но каким-то хамским образом, AJAX умудряется наплевать на UTF, и
M> показывает вот такую белиберду РљСѓРєСѓ
M> Обрыла все ресурсы по AJAX-у которые только нашла, и везде пишут
M> что мол "достаточно поставить хэдер, что у тебя content-type
M> UTF-8, и все должно работать"..
M> Ниченепонимаю.. я так и делаю, вроде, но нифига из того что
M> кирилицей написано, не видно.
M> XML смотрела (вывела в файл логгером), все там нормально, русские
M> буквы на месте.
M> По ходу, все буровит charset в самом http_request-е.
M> Кто из вас сталкивался с тиакой проблемой? Какие есть для этого
M> решения?

Ajax, если вы еще не поняли, это название техники, которая реализуется множеством фреймворков и библиотек. Что конкретно вы используете?
Posted via RSDN NNTP Server 2.0
Re[2]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 10:40
Оценка:
Здравствуйте, Yuri Khomich, Вы писали:

YK>Hello, Mimi!

YK>You wrote on Fri, 20 Oct 2006 08:30:02 GMT:

YK>Ajax, если вы еще не поняли, это название техники, которая реализуется множеством фреймворков и библиотек. Что конкретно вы используете?


Мы конкретно используем JavaScript на JSP странице. XML нам приходит из сервлета.
Re[3]: Unicode && AJAX
От: Yuri Khomich  
Дата: 20.10.06 10:52
Оценка:
Hello, Mimi!
You wrote on Fri, 20 Oct 2006 10:40:11 GMT:

YK>> Ajax, если вы еще не поняли, это название техники, которая

YK>> реализуется множеством фреймворков и библиотек. Что конкретно
YK>> вы используете?

M> Мы конкретно используем JavaScript на JSP странице. XML нам

M> приходит из сервлета.

Круто. Повторяю вопрос: каким образом вы посылаете запрос? Используете голый XMLHttpRequest?
Posted via RSDN NNTP Server 2.0
Re[4]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 10:59
Оценка:
YK>Круто. Повторяю вопрос: каким образом вы посылаете запрос? Используете голый XMLHttpRequest?

Значит так:
вот так инициализируется http_request (не знаю, "голый" он при этом получается аль нет)
http_request = false;
    if (window.XMLHttpRequest)
    {
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType)
        {
            http_request.overrideMimeType('text/xml');
        }
    }
    else if (window.ActiveXObject)
    { // IE
        try
        {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            alert("Exception caught " + e);
            try
            {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e)
            {
                alert("exception " + e);
            }
        }
    }


И посылается запрос вот так:

http_request.onreadystatechange = та-функция-которая-вызовется-при-ответе;
http_request.open('GET', url);
http_request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
http_request.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
http_request.send(null);


Фотт..
Re: Unicode && AJAX
От: Mycopka Россия http://mhehue.info
Дата: 20.10.06 11:07
Оценка:
Здравствуйте, Mimi, Вы писали:

M>Но каким-то хамским образом, AJAX умудряется наплевать на UTF, и показывает вот такую белиберду РљСѓРєСѓ


Вопрос на засыпку, белеберда получается при просмотре в какой кодировке? Может быть прошла двойная перекодировка еще до Servlet'а?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
---
With best regards и все такое :)
Re[2]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 11:17
Оценка:
Здравствуйте, Mycopka, Вы писали:

M>Здравствуйте, Mimi, Вы писали:


M>>Но каким-то хамским образом, AJAX умудряется наплевать на UTF, и показывает вот такую белиберду РљСѓРєСѓ


M>Вопрос на засыпку, белеберда получается при просмотре в какой кодировке? Может быть прошла двойная перекодировка еще до Servlet'а?


При просмотре в УТФ-8.
А каким образом могла произойти перекодировка? Перед посылкой запроса я ставлю хэдер

http_request.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
http_request.send();


В сервлете контент-тайп стоит "text/xml;charset=UTF-8". Что еще проверить?
Re[3]: Unicode && AJAX
От: Mycopka Россия http://mhehue.info
Дата: 20.10.06 11:28
Оценка:
Здравствуйте, Mimi, Вы писали:

M>Здравствуйте, Mycopka, Вы писали:


M>При просмотре в УТФ-8.

M>А каким образом могла произойти перекодировка? Перед посылкой запроса я ставлю хэдер

M>
M>http_request.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
M>http_request.send();
M>


M>В сервлете контент-тайп стоит "text/xml;charset=UTF-8". Что еще проверить?


Я так понимаю "Куку" в кодировке "UTF-8" было передано куда-то как "Windows-1251", а результат выдан в сервлет, где жестко определено, что это опять же "UTF-8".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
---
With best regards и все такое :)
Re[5]: Unicode && AJAX
От: Yuri Khomich  
Дата: 20.10.06 11:48
Оценка:
Hello, Mimi!
You wrote on Fri, 20 Oct 2006 10:59:51 GMT:

YK>> Круто. Повторяю вопрос: каким образом вы посылаете запрос?

YK>> Используете голый XMLHttpRequest?

M> Значит так:

M> вот так инициализируется http_request (не знаю, "голый" он при
M> этом получается аль нет)
M>
M> http_request = false;
M>     if (window.XMLHttpRequest)
M>     {
M>         http_request = new XMLHttpRequest();
M>         if (http_request.overrideMimeType)
M>         {
M>             http_request.overrideMimeType('text/xml');
M>         }
M>     }
M>     else if (window.ActiveXObject)
M>     { // IE         try         {
M>             http_request = new ActiveXObject("Msxml2.XMLHTTP");
M>         }
M>         catch (e)
M>         {
M>             alert("Exception caught " + e);
M>             try             {
M>                 http_request = new
M> ActiveXObject("Microsoft.XMLHTTP");
M>             }
M>             catch (e)
M>             {
M>                 alert("exception " + e);
M>             }
M>         }
M>     }
M>


M> И посылается запрос вот так:


M>
M> http_request.onreadystatechange =
M> та-функция-которая-вызовется-при-ответе;
M> http_request.open('GET', url);
M> http_request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan
M> 2000 00:00:00 GMT");
M> http_request.setRequestHeader("Content-Type", "text/xml;
M> charset=UTF-8");
M> http_request.send(null);
M>


Подозреваю, что если использовать метод POST то все ок?
Posted via RSDN NNTP Server 2.0
Re[4]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 11:50
Оценка:
Здравствуйте, Mycopka, Вы писали:

M>Я так понимаю "Куку" в кодировке "UTF-8" было передано куда-то как "Windows-1251", а результат выдан в сервлет, где жестко определено, что это опять же "UTF-8".


Из яваскрипта делается запрос AJAX-ом на url (который и есть сервлет с кодировкой утф-8). Этот сервлет берет из бизнес-логики XML (причем, в нем все русские символы нормально читаются, выводила логгером, видела), и как результат сервлет выдает XML. В яваскрипте я этот хмл беру вот так

var xmldoc = http_request.responseXML;


Дальше его разбираю. И вот тут он уже калеченный. Каким образом, непонятно..
Re[6]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 11:54
Оценка:
YK>Подозреваю, что если использовать метод POST то все ок?

да нет.. то же самое.
Re[7]: Unicode && AJAX
От: Yuri Khomich  
Дата: 20.10.06 12:14
Оценка:
Hello, Mimi!
You wrote on Fri, 20 Oct 2006 11:54:18 GMT:

YK>> Подозреваю, что если использовать метод POST то все ок?


M> да нет.. то же самое.


Давайте код сервлета, который формирует ответ.
И проверьте на всякий случай нет ли фильтров, которые могут производить перекодировку.
Posted via RSDN NNTP Server 2.0
Re[6]: [от модератора]
От: Blazkowicz Россия  
Дата: 20.10.06 12:21
Оценка:
Здравствуйте, Yuri Khomich, Вы писали:

<много строк поскипано>
YK>Подозреваю, что если использовать метод POST то все ок?


Подобный способ цитирования — верная дорога в баню. Будьте осторожны.
Re[8]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 12:35
Оценка:
Здравствуйте, Yuri Khomich, Вы писали:

YK>Hello, Mimi!

YK>You wrote on Fri, 20 Oct 2006 11:54:18 GMT:

YK>>> Подозреваю, что если использовать метод POST то все ок?


M>> да нет.. то же самое.


YK>Давайте код сервлета, который формирует ответ.

YK>И проверьте на всякий случай нет ли фильтров, которые могут производить перекодировку.

Фильтр есть, но он вроде как в УТФ-8 все и перекодирует. Вот что у меня добавлено в web.xml


<filter>
    <filter-name>Charset Filter</filter-name>
    <filter-class>utilities.CharsetFilter</filter-class>
    <init-param>
      <param-name>requestEncoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>



Вот примерно код сервлета:


public void doPost(HttpServletRequest request, HttpServletResponse response) throws
        ServletException, IOException
{
    // проверяем, есть ли юзер в сессии
    // если да, пишем лог, что такой-то юзер запросил такую-то инфу 
    // ... проверяем права юзера... 
    // если можно позволить юзеру достать ту инфу, то 

    response.setContentType(CONTENT_TYPE); // "text/xml; charset=UFT-8" берется из глобалсов 
    blManager blMan = new blManager();
    String retXmlBuf = null;
    
    if(isAuthorizedToGetThisInfo) retXmlBuf = blMan.getXMLfor(utilities.Globals.SOME_DEFINED_VAR);
    out.println(retXmlBuf);
    out.close();
    

// вот что пишется в лог:

// Content-Type: text/xml;charset=UTF-8
// ------------------------------------------
// Собсна буфер:
// <?xml version="1.0" encoding="utf-8"?>
// <Projects Name="Projects">
// <Project ID="17" Name="Project">
// <Name Name="Name" formap="1">Куку</Name>
// <Description Name="Description">тралала</Description>
// <CustomerID Name="Customer ID">54</CustomerID>
// <CustomerCompanyName Name="Customer Company Name"/>
// <CustomerContactFirstName Name="Customer Contact First Name">Василиса</CustomerContactFirstName>
// <CustomerContactLastName Name="Customer Contact Last Name">Прекрасная</CustomerContactLastName>
// <CustomerBillingAddress Name="Customer Billing Address"/>
// <CustomerCity Name="Customer City"/>
// <CustomerStateorProvince Name="Customer State or Province"/>
// <CustomerPostalCode Name="Customer Postal Code"/>
// <CustomerCountry Name="Customer Country"/>
// <CustomerContactTitle Name="Customer Contact Title"/>
// <CustomerPhoneNumber Name="Customer Phone Number"/>
// <CustomerFaxNumber Name="Customer Fax Number"/>
// <CustomerEmailAddress Name="Customer Email Address"/>
// <CustomerNotes Name="Customer Notes"/>
// <StartDate Name="Start Date">1999-04-04</StartDate>
// <Identifier Name="Identifier">и вот и все</Identifier>
// <Custom1 Name="Custom1">кастом 1</Custom1>
// <Custom2 Name="Custom2">кастом 2</Custom2>
// <Custom3 Name="Custom3">кастом 3</Custom3>
// <Custom4 Name="Custom4">кастом 4</Custom4>
// </Project>
// </Projects>
}
Re[7]: [от модератора]
От: Mimi  
Дата: 20.10.06 12:41
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

Проблема в том, что "много строк проскипано"? Я правильно поняла? Пардон, не знала. В баню не надо, мне бы срочно проблему решить.
Re[7]: [от модератора]
От: Yuri Khomich  
Дата: 20.10.06 12:43
Оценка:
Hello, Blazkowicz!
You wrote on Fri, 20 Oct 2006 12:21:19 GMT:

B>

<много строк поскипано>
YK>> Подозреваю, что если использовать метод POST то все ок?


B> Подобный способ цитирования — верная дорога в баню. Будьте

B> осторожны.

Проблема в оверквотинге (как вам кажется) или в чем-то еще?
Posted via RSDN NNTP Server 2.0
Re[8]: [от модератора]
От: Blazkowicz Россия  
Дата: 20.10.06 12:45
Оценка:
Здравствуйте, Mimi, Вы писали:

M>Проблема в том, что "много строк проскипано"?

Вы Yuri Khomich?

M>Я правильно поняла?

Кто знает...

M>Пардон, не знала.

Так может стоит просветится?
Re[8]: [от модератора]
От: Blazkowicz Россия  
Дата: 20.10.06 12:56
Оценка:
Здравствуйте, Yuri Khomich, Вы писали:

YK>Проблема в оверквотинге (как вам кажется) или в чем-то еще?


Нет, проблема в том что Вам кажется что его нет. На сем рекомендую прекратить публичное обусждение и при желании продолжить в привате.
Re[9]: Unicode && AJAX
От: Yuri Khomich  
Дата: 20.10.06 13:08
Оценка:
Hello, Mimi!
You wrote on Fri, 20 Oct 2006 12:35:55 GMT:

YK>> Давайте код сервлета, который формирует ответ.

YK>> И проверьте на всякий случай нет ли фильтров, которые могут
YK>> производить перекодировку.

M> Фильтр есть, но он вроде как в УТФ-8 все и перекодирует.


M>
M> <filter>
M>     <filter-name>Charset Filter</filter-name>
M>     <filter-class>utilities.CharsetFilter</filter-class>
M>     <init-param>
M>       <param-name>requestEncoding</param-name>
M>       <param-value>UTF-8</param-value>
M>     </init-param>
M>   </filter>
M>


Я имел в виду фильтр, который перекодирует ответ, а не запрос.
Для уверенности фильтры временно можно убрать, строки и так в UTF-8.

M> Вот примерно код сервлета:


M>
M>     if(isAuthorizedToGetThisInfo) retXmlBuf =
M> blMan.getXMLfor(utilities.Globals.SOME_DEFINED_VAR);
M>     out.println(retXmlBuf);
M>


Если retXmlBuf это строка, а не какой-нибудь массив байт, то идей больше нет.
Posted via RSDN NNTP Server 2.0
Re[10]: Unicode && AJAX
От: Mimi  
Дата: 20.10.06 13:17
Оценка:
Здравствуйте, Yuri Khomich, Вы писали:

YK>Hello, Mimi!

YK>You wrote on Fri, 20 Oct 2006 12:35:55 GMT:

YK>>> Давайте код сервлета, который формирует ответ.

YK>>> И проверьте на всякий случай нет ли фильтров, которые могут
YK>>> производить перекодировку.

M>> Фильтр есть, но он вроде как в УТФ-8 все и перекодирует.


M>>
M>> <filter>
M>>     <filter-name>Charset Filter</filter-name>
M>>     <filter-class>utilities.CharsetFilter</filter-class>
M>>     <init-param>
M>>       <param-name>requestEncoding</param-name>
M>>       <param-value>UTF-8</param-value>
M>>     </init-param>
M>>   </filter>
M>>


YK>Я имел в виду фильтр, который перекодирует ответ, а не запрос.

YK>Для уверенности фильтры временно можно убрать, строки и так в UTF-8.

Нет, такого фильтра нет. Думаете, стоит использовать также и фильтр для перекодировки ответа?
Щас попробую убрать фильтр временно...

M>> Вот примерно код сервлета:


M>>
M>>     if(isAuthorizedToGetThisInfo) retXmlBuf =
M>> blMan.getXMLfor(utilities.Globals.SOME_DEFINED_VAR);
M>>     out.println(retXmlBuf);
M>>


YK>Если retXmlBuf это строка, а не какой-нибудь массив байт, то идей больше нет.


retXmlBuf у нас String.
Т.е. если бы это был byte array то возможно это могло стать причиной ошибки?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.