Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.04.2009, 02:46
Аспирант
Отправить личное сообщение для alekciy Посмотреть профиль Найти все сообщения от alekciy
 
Регистрация: 27.12.2008
Сообщений: 31

xmlhttprequest.ru
Поскольку ссылки с xmlhttprequest.ru приводят нас именно сюда, то сильно подозреваю, что автор вышеприведенной статьи (которая мне нравиться) обитает и тут. Очень уж хочеться прояснить некоторые моменты которые возникли в каментах к статье, но были автором не просмотрены (проигнорированы?! ) и ни как не прокоментированны.

Собственно вопрос изложен в "Опубликовано alekciy (не зарегистрирован) в 12.01.2009 в 11:30." (чуть ниже возник вторично).

Если автор есть на форуме, то пусть отпишется по этому поводу. Впрочем жду каментов от всех заинтерисованных форумчан.
Ответить с цитированием
  #2 (permalink)  
Старый 19.04.2009, 16:14
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Все очень просто, в JavaScript все строки кодируются в UTF-8. Другими словами, в JavaScript ведется работа только с этой кодировкой, независимо от того, какой кодировки документ. Поэтому и данные, отправляемые XMLHTTPRequest должны быть в этой кодировке (исключая баг ie6).

Проверить это достаточно просто:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
header('Content-type: text/html; codepage=windows-1251');
?>
<html>
	<head>
		<meta http-equiv="Content-type" content="text/html;codepage=windows-1251" />
		<script	type="text/javascript">
		request = new XMLHttpRequest();
		request.open("POST", "/?var=привет_я_строка_в_утф", true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					alert(request.responseText);
				}
			}
		};
		request.send(null);
		</script>
	</head>
</html>
<?
} else {
	header('Content-type: text/html; codepage=windows-1251');
	echo iconv('UTF-8', 'cp1251', $_GET['var']); // привет_я_строка_в_утф
}
?>


Порядок примерно такой:
1. Код скрипта JavaScript перед выполнением кодируется из кодировки документа в UTF-8.
2. Через XMLHTTPRequest строка UTF-8 "/?var=привет_я_строка_в_утф" передается на сервер.
3. На сервере переменная $_GET['var'] имеет кодировку UTF-8, перекодируется в cp1251 и возвращается.
4. В возвращенном результате опять происходит перекодирование из кодировки документа в UTF-8.

П.С:
Я могу ошибаться, я не могу сказать, что уверен в этом механизме работы, если я не прав, пусть меня поправят

Последний раз редактировалось Андрей Параничев, 19.04.2009 в 16:26.
Ответить с цитированием
  #3 (permalink)  
Старый 19.04.2009, 18:56
Аспирант
Отправить личное сообщение для alekciy Посмотреть профиль Найти все сообщения от alekciy
 
Регистрация: 27.12.2008
Сообщений: 31

header('Content-type: text/html; codepage=windows-1251');

Не существует такого заголовка. charset есть, codepage нет.
Ответить с цитированием
  #4 (permalink)  
Старый 19.04.2009, 19:41
Аспирант
Отправить личное сообщение для alekciy Посмотреть профиль Найти все сообщения от alekciy
 
Регистрация: 27.12.2008
Сообщений: 31

Просто из того, что я вижу в процессе опытов я прихожу к выводу о том, что браузер делает encodeURI автоматически. Это хорошо видно в том же FireBug. Я кстати говорю о GET запросах.

Цитата:
Все идущие на сервер параметры GET/POST, кроме случая multipart/form-data, кодируются в UTF-8. Не в кодировке страницы, а именно в UTF-8.
Но encodeURI это не тоже самое, что charset. И на самом деле выходит, что данные при GET уходя в виде UCS, и кодировка этих данных видимо в Latin-1 на самом деле, а не в UTF-8. И лишь на сервере делается перекодирование из UCS представления в машинный вид UTF. Что бы это проверить просто нужно словить двоичный дамп запроса посылаемого серверу, но для локальной машины я сейчас с ходу не могу этого сделать (ибо Wireshark снифить localhost не хочет). Видимо следует покурить в сторону tcpdump. Просто им я ни когда не пользовался, вот и подумал, может кто-то уже делал такого рода проверку и точно может подтвердить/опровергнуть мои соображения.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск