Jump to content
  • 0

Установка кодировки ajax-запроса чтобы вернуть ее в ответе..


Dymytry
 Share

Question

День добрый!

Господа, стоит такая задача:

Есть jquery.ajax() который нечто возвращает на страницу. Страница бывает в разных кодировках. Надо подогнать кодировку ответа под кодировку страницы.

Я хочу сделать такое решение:

передавать кодировку через header запроса на сервер, и посмотрев на кодировку страницы сервером выдавать строки в нужной мне кодировке. Проблема в том что я никак не могу задать headers ajax-запроса.

я пробую делать это через параметр contentType : "windows-1251" или параметр-функцию beforeSend(request) {request.setRequestHeader("Content-Type", "text/javascript; charset: windows-1251")}, но отправляемый запрос не содержит соотв. заголовка.

Можно передавать его в аттрибутах запроса, но пока не хотелось бы.

Что я делаю не так?

Можно ли решить проблему иначе?

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

а как это в разной кодировке? Т.е. у тебя сервер отдаёт всегда страницы в кодировке в случайном порядке?

Сервер отдает в той кодировке которую я ставлю. Но страница запрашивающая ответ может быть в разных кодировках. Цель - совместить.

1. Напрямую через XMLHttpRequest можно передавать только строки в кодировке UTF-8. Отсюда.

Загляни туда - возможно поможет..

Мне не нужно передавать в windows-1251. Мне нужно всего лишь передать строчку "windows-1251" на сервер (хотелось бы в headers), а потом на сервере я уже закодирую ответ в windows-1251 сам.

Link to comment
Share on other sites

  • 0

Dymytry, всё равно не понял, поясни. Какая страница? Или у тебя весь сайт в разных кодировках?

У меня разные сайты. На разных сайтах разные кодировки. Я делаю универсальный скрипт для них всех. Скрипт должен брать кодировку через document.defaultCharset и отправлять ее на сервер для того, чтобы сервер вернул ответ в нужной кодировке. Как кодировать на сервере я конечно знаю. У меня не получается необязательная в сущности мелочь: передать content-type header = charser windows 1251 на сервер используя метод ajax библиотеки jquery. Я пробую делать это через параметр contentType : "windows-1251" или параметр-функцию beforeSend(request) {request.setRequestHeader("Content-Type", "text/javascript; charset: windows-1251")}, но отправляемый запрос не содержит соотв. заголовка. Да, я могу передать кодировку через аттрибуты запроса, но не хотелось бы.

Кроме того, может есть другие решения проблемы, например javascript который переводит кодировку строки из utf-8 в любую заданную. Это мне бы тоже подошло и даже лучше - не надо править серверную часть.

Edited by Dymytry
Link to comment
Share on other sites

  • 0

Блин, так передавайте или 1 или 0, что будет означать utf-8 или win-1251, как вариант. как вариант вообще можно без аргумента по дефолту, с аргументом перекодирование в 1251. Это будет лучше и проще, но вам тада надо строки обрабатывать через icon-v или ещё как то.

Но лучше всего использовать json -- ему похрен абсолютно на кодировку ибо свой стандарт. В таком случае будете писать что-то вроде:


$.ajax({
type: "POST", // "GET"
url: "request/path",
data: {
1: 1,
2: 2,
3: 3
},
timeout: 3500,
dataType: 'json', // <<< this
success: function(data){
// callback append
},
error: function() {
// callback error
}
});

и тогда сервером выставляете application json. собсно функции для конвертации в json есть, там же все эскейпы последовательностей(Uxxx: simbol unicode)

p.s.: ну и кроме аякса есть ещё $.post и $.get, они тоже весьма удобны в некоторых случаях

p.s.s: и вообще как бы да, windows-1251 -- говно

Edited by Shift-Web
Link to comment
Share on other sites

  • 0


/**
* Converts a PHP variable into its Javascript equivalent.
*
* We use HTML-safe strings, i.e. with <, > and & escaped.
*/
function string_to_js($var) {
switch (gettype($var)) {
case 'boolean':
return $var ? 'true' : 'false'; // Lowercase necessary!
case 'integer':
case 'double':
return $var;
case 'resource':
case 'string':
/* Patch ++ */

// Always use Unicode escape sequences (\u0022) over JSON escape
// sequences (\") to prevent browsers interpreting these as
// special characters.
$replace_pairs = array(
// ", \ and U+0000 - U+001F must be escaped according to RFC 4627.
'\\' => '\u005c',
'"' => '\u0022',
"\x00" => '\u0000',
"\x01" => '\u0001',
"\x02" => '\u0002',
"\x03" => '\u0003',
"\x04" => '\u0004',
"\x05" => '\u0005',
"\x06" => '\u0006',
"\x07" => '\u0007',
"\x08" => '\u0008',
"\x09" => '\u0009',
"\x0a" => '\u000a',
"\x0b" => '\u000b',
"\x0c" => '\u000c',
"\x0d" => '\u000d',
"\x0e" => '\u000e',
"\x0f" => '\u000f',
"\x10" => '\u0010',
"\x11" => '\u0011',
"\x12" => '\u0012',
"\x13" => '\u0013',
"\x14" => '\u0014',
"\x15" => '\u0015',
"\x16" => '\u0016',
"\x17" => '\u0017',
"\x18" => '\u0018',
"\x19" => '\u0019',
"\x1a" => '\u001a',
"\x1b" => '\u001b',
"\x1c" => '\u001c',
"\x1d" => '\u001d',
"\x1e" => '\u001e',
"\x1f" => '\u001f',
// Prevent browsers from interpreting these as as special.
"'" => '\u0027',
'<' => '\u003c',
'>' => '\u003e',
'&' => '\u0026',
// Prevent browsers from interpreting the solidus as special and
// non-compliant JSON parsers from interpreting // as a comment.
'/' => '\u002f',
// While these are allowed unescaped according to ECMA-262, section
// 15.12.2, they cause problems in some JSON parser.
"\xe2\x80\xa8" => '\u2028', // U+2028, Line Separator.
"\xe2\x80\xa9" => '\u2029', // U+2029, Paragraph Separator.
);

return '"'. strtr($var, $replace_pairs) .'"';

case 'array':
// Arrays in JSON can't be associative. If the array is empty or if it
// has sequential whole number keys starting with 0, it's not associative
// so we can go ahead and convert it as an array.
if (empty ($var) || array_keys($var) === range(0, sizeof($var) - 1)) {
$output = array();
foreach ($var as $v) {
$output[] = string_to_js($v);
}
return '[ '. implode(', ', $output) .' ]';
}
// Otherwise, fall through to convert the array as an object.
case 'object':
$output = array();
foreach ($var as $k => $v) {
$output[] = string_to_js(strval($k)) .': '. string_to_js($v);
}
return '{ '. implode(', ', $output) .' }';
default:
return 'null';
}
}

/**
* Return data in JSON format.
*
* This function should be used for JavaScript callback functions returning
* data in JSON format. It sets the header for JavaScript output.
*
* @param $var
* (optional) If set, the variable will be converted to JSON and output.
*/
function string_json($var = NULL) {
// We are returning JavaScript, so tell the browser.


page_set_header('Content-Type: application/json; charset=utf-8');

if (isset($var)) {
echo string_to_js($var);
}
}

что типа того

Link to comment
Share on other sites

  • 0

что типа того

Спасибо, но это я так понял PHP?

Мне нужно на стороне клиента - js.

А что вы имели ввиду "Но лучше всего использовать json -- ему похрен абсолютно на кодировку ибо свой стандарт. В таком случае будете писать что-то вроде:"?

Насколько я понимаю ajax всегда вернет данные в UTF-8. И JSON тоже.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy