Xpoint
   [напомнить пароль]

Принудительно поставить русскую кодировку в XMLHttpRequest

2005-04-22 15:40:39 [обр] alc [досье]

Здравствуйте!
Пишу расширение, возникла проблема с XMLHttpRequest. Есть такой код:

  var xrequest=new XMLHttpRequest();
  xrequest.open("GET",url,false);
  xrequest.setRequestHeader("Accept-Language", "ru, en");
  xrequest.setRequestHeader("Accept-Charset", "windows-1251"); 
  xrequest.send("");
  var result=xrequest.responseText;

В принципе работает, но сервер выдает неполные заголовки без "charset=windows-1251". И в результате responseText коверкает русские буквы. Повлиять на администрацию сервера нет возможности. Форум облазил, но нашел решение лишь для IE с помощью ADODB.Recordset и ResponseBody, а вот для Mozilla/FF нет. Как быть?

спустя 5 часов [обр] Алексей Севрюков [досье]
alc[досье] Менять надо не Ваши заголовки, а серверные. Сервер должен вернуть:
Content-type: text/plain; charset=windows-1251
спустя 17 часов [обр] alc [досье]
Я понял вашу мысль, но повлиять на админов сервера, чтобы они изменили заголовки, не могу. Неужели другого решения не существует? Можно ли, например, получить информацию с сервера как-нибудь по-другому, без использования XMLHttpRequest, мне требуется лишь считать содержимое файла.
спустя 20 часов [обр] Алексей Севрюков [досье]
alc[досье] Бредовая идея: А может попробовать overrideMimeType и в него вписать кодировку?
спустя 2 дня 1 час [обр] Владимир Палант [досье]

Алексей Севрюков[досье]
Именно так:

request.overrideMimeType('text/plain; charset=windows-1251');

У меня работает.

спустя 9 дней [обр] alc [досье]

Да работает, но частично (firefox 1.0.1). Почему-то при использовании overrideMimeType грузится, в лучшем случае, 4096 байт, без overrideMimeType все хорошо. Вот первый вариант:

function loader()
{
  try
  {
    var request=new XMLHttpRequest();
    request.open("GET", "http:/blablabla/blablabla.txt",true);
    request.overrideMimeType('text/plain;charset=windows-1251');
    request.onreadystatechange = function() 
                            {                               
                               if(request.readyState == 4) 
                               {
                                 if(request.status==200)
                                 {
                                   alert(request.responseText.length);
                                 }
                                 else
                                 {
                                   alert("Loading Error");
                                 }
                               }
                            }    
    request.send("");
  }
  catch(ex)
  { 
    alert(ex); 
  }

В нем недогружаются данные. А вот второй вариант (nsIJSXMLHttpRequest), в нем, вообще, порождается ошибка загрузки:

function loader2()
{
  try
  {
    var request=new XMLHttpRequest();
    request.open("GET", “http:/blablabla/blablabla.txt”,true);
    request.overrideMimeType('text/plain;charset=windows-1251');
    request.onload = function() 
                            {                               
                               if(request.readyState == 4) 
                               {
                                 if(request.status==200)
                                 {
                                   alert(request.responseText.length);
                                 }
                                 else
                                 {
                                   alert("Loading Error");
                                 }
                               }
                            }
    
    request.onerror = function() 
                             {
                             alert("Error");
                             } 
    request.send("");
  }
  catch(ex)
  { 
    alert(ex); 
  }

Никто не сталкивался с таким странным поведением? Может в коде что-то не так?

спустя 2 часа 16 минут [обр] Владимир Палант [досье]
Какой-то глюк из-за того, что после overrideMimeType() Mozilla всегда пытается парсить XML, даже если MIME указан не XML. Обходится в вашем случае просто: вместо text/plain указать text/xml.
спустя 1 час 12 минут [обр] Владимир Палант [досье]
PS: Mozilla ведёт себя корректно в том смысле, что выдаётся ошибка (readyState переключается на 4 и в случае ошибки). Если сделать синхронный запрос, то из исключения будет видно код ошибки: NS_ERROR_FAILURE. К сожалению, этот просто общее название для нестандартной ошибки, поэтому всё равно придётся поискать, откуда она берётся.
спустя 1 час 42 минуты [обр] Владимир Палант [досье]

bug 293046

Примечание от 2006-03-07: этот баг исправлен, в Firefox 1.5+/SeaMonkey 1.0+ всё работает нормально.

Powered by POEM™ Engine Copyright © 2002-2005