Я отправляю запрос AJAX POST, используя jQuery для расширения chrome, но данные не поступают, как ожидалось, акцентированные символы оказываются искаженными.

Текст "HÄGERSTEN" становится "HÃ" GERSTEN ".

Текст отображается нормально в консоли и т. Д., Только через AJAX для этой другой страницы он выглядит как упоминалось. Мой AJAX-вызов является базовым, я отправляю объект данных через jQuery $ .ajax. Я пробовал как с, так и без contentType, UTF-8 и ISO-8859-1. Нет разницы.

Вот как я делаю свой AJAX-вызов:

var newValues = {name: 'HÄGERSTEN'}

$.ajax({
    url: POST_URL,
    type: 'POST',
    data: newValues,
    success: function() ...
});

Объект newValues имеет больше значений, но я извлекаю их из формы. Тем не менее, я попытался указать эти значения вручную как newValues['name'] = 'ÄÄÄÄ'; и все равно вызовет ту же проблему

Исходный элемент формы страницы, на которую я отправляю AJAX, содержит атрибут accept-charset="iso-8859-1". Может быть, это имеет значение.

Целевой сайт использует Servlet/2.5 JSP/2.1. Просто если это может иметь значение.

Я предполагаю, что это проблема кодирования, и, как я понял, это должно быть потому, что расширения Chrome требуют, чтобы файлы сценариев были закодированы в кодировке UTF-8, что, вероятно, конфликтует с веб-сайтом, на котором работает плагин, и целевой страницей AJAX (тот же веб-сайт), которая использует кодировку ISO-8859-1, однако я понятия не имею, как с этим бороться. Я пробовал несколько методов декодирования / кодирования его и от UTF-8 до ISO-8859-1 и другие приемы безуспешно.

Я пытался использовать encodeURIComponent для своих значений, что позволяет отображать их только в той форме, в которой отображаются значения, отправленные мной через POST, например, {{Х1}} .

У меня нет доступа к серверу веб-сайтов и я не могу сказать вам, является ли это проблемой с их стороны, однако я бы не стал так думать.

ОБНОВЛЕНИЕ

Теперь я понял, что данные POST должны быть отправлены как UTF-8! Так что конверсия не проблема?

7
Colandus 16 Дек 2015 в 17:24

4 ответа

Лучший ответ

Я не знаю, удалось ли это решить с помощью POST-данных и AJAX. Возможно, если бы я сделал чистый вызов JavaScript XHR AJAX, я мог бы отправлять POST-данные, закодированные так, как мне нравится. Я понятия не имею.

Однако в отчаянии я попробовал свой последний вариант (или то, что мне показалось); отправить запрос в виде GET-данных. Мне повезло, и целевая страница приняла GET-данные.

Очевидно, проблема все еще сохранялась, так как я отправлял данные таким же образом, будучи в кодировке UTF-8. Поэтому вместо того, чтобы отправлять данные как объект, я анализировал данные в строку, удобную для URL, с моей собственной функцией, используя escape, убедившись, что они совместимы с ISO-8859-1 (поскольку encodeURIComponent кодирует URI как UTF-8, в то время как escape кодирует строки, делая их совместимыми с ISO-8859-1).

Простая функция, которая вылечила мои головные боли:

function URLEncodeISO(values) {
   var params = [];
   for(var k in values) params[params.length] = escape(k) + '=' + escape(values[k]);
   return params.join('&');
}
2
Colandus 25 Дек 2015 в 12:10

Похоже, что данные передаются в кодировке UTF-8 и неправильно декодируются на стороне сервера. Он должен быть декодирован на стороне сервера. Проверьте это с помощью следующих функций кодирования и декодирования:

function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

function decode_utf8(s) {
  return decodeURIComponent(escape(s));
}

var encoded_string = encode_utf8("HÄGERSTEN");
var decoded_string = decode_utf8(encoded_string);
document.getElementById("encoded").innerText = encoded_string;
document.getElementById("decoded").innerText = decoded_string;
<div>
Encoded string: <span id="encoded"></span>
</div>
<div>
Decoded string: <span id="decoded"></span>
</div>
2
jianweichuah 19 Дек 2015 в 02:29

Мы тоже столкнулись с такой же ситуацией, но в нашем случае мы всегда отправляли параметры, используя JSON.stringify.
Для этого вам нужно внести изменения,
1) При вызове страницы через AJAX необходимо добавить тег content-type, определяющий, в какие данные кодирования отправляются

$.ajax
    ({
        type: "POST",
        url: POST_URL,
        dataType: 'json',//In our case the datatype is JSON
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(newValues),//I always use parameters to be sent in JSON format

< Сильный > ИЗМЕНИТЬ
Прочитав ваш вопрос более четко, я узнал, что ваш JSP на стороне сервера использует кодировку ISO-8859-1 и прочитав некоторые сообщения, я узнал, что все POST данные метода будут передаваться с использованием UTF-8, как уже упоминалось.

Данные POST всегда будут передаваться на сервер с использованием кодировки UTF-8 в соответствии со стандартом W3C XMLHTTPRequest.

Но при чтении поста jquery-ignores-encoding-iso-8859-1 был опубликован обходной путь iappwebdev, который может быть полезен и поможет вам,

 $.ajax({
    url: '...',
    contentType: 'Content-type: text/plain; charset=iso-8859-1',
    // This is the imporant part!!!
    beforeSend: function(jqXHR) {
        jqXHR.overrideMimeType('text/html;charset=iso-8859-1');
    }
});

Приведенный выше код взят из кода, опубликованного iappwebdev

1
Community 23 Май 2017 в 12:16

Кодирование символов на стороне клиента не полностью зависит от вас (представьте себе, что вы используете страницу от разных пользователей по всему миру: китайский, итальянский ...), в то время как на стороне сервера вам нужно обрабатывать кодирование для ваших целей.

Таким образом, данные в Ajax-POST могут продолжать кодироваться в UTF8, но на вашей стороне сервера вы можете сделать следующее:

PHP:

$ name = utf8_decode ($ _ POST ['name']);

JSP:

request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
1
gaetanoM 21 Дек 2015 в 21:13