Расширение Chrome ajax отправка искаженных акцентированных символов

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

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

текст отображается нормально в консоли и т. д., Только через AJAX на эту другую страницу он появляется, как указано. Мой вызов AJAX является базовым, я отправляю объект данных через jQuery $.Аякс. Я пробовал как с 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. Просто incase это может сделать разница.

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

I пробовал с помощью encodeURIComponent на моих значениях, которые только заставляют их показывать этот путь точно в форме, которая отображает значения, которые я отправил по почте, например H%C3%84GERSTEN.

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

обновление

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

4 ответов


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

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

очевидно, проблема все еще сохранялась, поскольку я отправлял данные таким же образом, будучи кодированным 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('&');
}

похоже, что данные кодируются 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>

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

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

PHP:

$name = utf8_decode ($_POST ['name']);

JSP:

request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");

мы тоже столкнулись с той же ситуацией, но в нашем случае мы всегда отправляли параметры, используя 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

но во время чтения post jquery-игнорирует-кодировка-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