Все очень просто, в 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.
П.С:
Я могу ошибаться, я не могу сказать, что уверен в этом механизме работы, если я не прав, пусть меня поправят
