Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] Как изменить кодировку новосозданного документа (http://forum.oszone.net/showthread.php?t=66881)

hasherfrog 06-06-2006 13:52 447355

Как изменить кодировку новосозданного документа
 
Вопрос достаточно сложный.
WINDOWS XP, Firefox 1.5.0.4

По умолчанию, кодировка страницы, созданной через javascript - UTF-8.
Как выглядит "создание":
Код:

javascript:
(function(){
  nW = window.open('','test','width=200,height=200');
  nD=nW.document;
  nD.open();
  nD.writeln('<?xml version="1.0" encoding="windows-1251"?>');
  nD.writeln('<html><head><title>Test</title><base target=\'_blank\'>');
  nD.writeln('<meta http-equiv="content-type" content="text/html; charset=windows-1251">');
  nD.writeln('</head><script></script><body>');
  nD.writeln('<p>ТЕКСТ</p>');
  nD.writeln('</body></html>');
  nD.close();
  nW.focus();
  /*nW.close();*/
}
)()

Когда документ создан, всё вроде бы нормально. Но если его теперь сохранить... Получим кракозябли.
Тоже самое будет, если созданный документ имеет POST-форму - передаваемый текст будет искорёжен.

Если у созданного документ посмотреть кодировку - увидим... UTF-8.
А по идее, должны иметь WIN1251.

Если бы вопрос стоял о сохранении документа, я бы сменил кодировку в тексте "charset="
Если бы форма была метода GET, я переконвертировал бы текст UTF8 -> WIN1251.
Но у меня затык именно с формой POST. :[

Задача такая: нужно явным образом указать нужную кодировку у созданного через javascript документа.

Есть какие-нибудь мысли по поводу?

Vlad Drakula 06-06-2006 13:58 447360

hasherfrog
почему с POST не поспунить так же как с GET ???

Цитата:

Если бы форма была метода GET, я переконвертировал бы текст UTF8 -> WIN1251.

hasherfrog 06-06-2006 14:12 447368

Vlad Drakula
Потому что GET (в таком случае) я формирую уже прямым созданием корректного URL'а и перехожу по нему.
То есть я не перекодирую текст, записываю в форму, делаю сабмит, а сразу, самостоятельно иду куда мне нужно.
А с POST'ом такой номер не пройдёт - мне нужно именно корректно выставить значения текстовых полей.
А я не могу!!! Я туда пишу вроде корректный текст, но он-то "оказывается" UTF-8! Хотя при этом передаётся - как WIN1251.
Принимающий сервер обалдевает и не понимает.

Vlad Drakula 06-06-2006 14:20 447374

hasherfrog
чего то я не помню чтобы на принимающий сервер отправлялось значение в какой кодировке текст...

hasherfrog 06-06-2006 14:26 447375

Для наглядности. Передаём слово "АБВГДЕЙКА"
Как должно быть (это вариант вызова со страницы, предварительно сохранённой на диск)
Код:

POST /request.php HTTP/1.1
Host: xxx.xxx.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: xx
text=%C0%C1%C2%C3%C4%C5%C9%CA%C0

А вот как передаётся со страницы, созданной javascript'ом:
Код:

POST /request.php HTTP/1.1
Host: xxx.xxx.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: xx
text=%D0%90%D0%91%D0%92%D0%93%D0%94%D0%95%D0%99%D0%9A%D0%90

Принимающий сервер ждёт от меня (очевидно) win1251.
А я ему втюхиваю UTF8. Но как переслать именно win1251???

hasherfrog 06-06-2006 14:50 447389

// На тот случай, если кто-нибудь будет думать сходно со мной
// Я уже кучу бредовых вариантов перепробЫвал.

Если перекодировать текст (который UTF-8) в Win1251, затем сделать unescape, записать результат в форму, и послать.
При посылке вроде будет сделан escape() и "получится". Но в результате всё равно посылается бред:
Код:

text=%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%89%C3%8A%C3%80
В общем, все эти трюки ничего не дают.
Единственный способ - явно указать Firefox, что кодировка страницы, с которой производится отправка - Win 1251.
А вот это я никак не могу сделать, по умолчанию она всё время UTF-8.

Vlad Drakula 06-06-2006 16:13 447423

hasherfrog
эта бролмемма возникает тольуо в FF или и в других бпроузерах тоже?

hasherfrog 07-06-2006 10:50 447819

Vlad Drakula
Всё, разрешилось.
http://forum.mozilla.ru/viewtopic.php?id=10773
Всем спасибо.
Код:

<script>
function show() {
  var doc = 'data:text/html;charset=windows-1251,<html><head><title>Test</title><base target="_blank"></head><script><'+'/script><body><p>ТЕКСТ</p></body></html>';
  var nW = window.open(doc,'test','width=200,height=200');
  nW.focus();
  return false;
}
</script>
<body><a onclick="return show()">click me</a></body>

То, что нужно.

hasherfrog 07-06-2006 14:17 447956

Результат (Данный букмарклет ищет нужное слово в словарях и онлайн-энциклопедиях на dic.academic.ru)
Код:

javascript:(function(){var x=prompt('Search for','');if(x!=null){var doc='<html><head><title>Test</title><base target="_blank">';doc+='</head><script><'+'/script><body>';doc+='<form action="http://dic.academic.ru/searchall.php" method="post" name="searchform" accept-charset="windows-1251">';var chks=new Array("dic[lower]","dic[ushakov]","dic[enc1p]","dic[enc2p]","dic[enc3p]","dic[ogegova]","dic[brokgauz]","dic[muller]","dic[idioms]","dic[fin_enc]","dic[econ_dict]","dic[efin_dic]","dic[fin2]","dic[anticris]","dic[geolog]","dic[hist_dic]","dic[biograf]","onlythermin");for(var i=0;i<chks.length;i++){doc+='<input name="';doc+=chks[i];doc+='" checked="checked" type="checkbox">';}doc+='<input name="thermin" type="text" value="';doc+=x;doc+='">';doc+='<input name="sss" type="submit">';doc+='</body></html>';var nW=window.open('','hash','width=200,height=100');var nD=nW.document;nD.open('text/html');nD.writeln(doc);nD.close();nW.focus();nD.searchform.submit();nW.close();}})()


Время: 20:32.

Время: 20:32.
© OSzone.net 2001-