Я отправляю запрос 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! Так что конверсия не проблема?
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('&');
}
Похоже, что данные передаются в кодировке 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>
Мы тоже столкнулись с такой же ситуацией, но в нашем случае мы всегда отправляли параметры, используя 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
Кодирование символов на стороне клиента не полностью зависит от вас (представьте себе, что вы используете страницу от разных пользователей по всему миру: китайский, итальянский ...), в то время как на стороне сервера вам нужно обрабатывать кодирование для ваших целей.
Таким образом, данные в Ajax-POST могут продолжать кодироваться в UTF8, но на вашей стороне сервера вы можете сделать следующее:
PHP:
$ name = utf8_decode ($ _ POST ['name']);
JSP:
request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name");
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.