Расширение 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