Передача переменной JQuery AJAX в ISO8859_1
У меня есть php-код, который перехватывает переменную из параметра URL и передает ее через текстовое поле html edditbale в Jquery/Ajax, а затем во внешний php-код, который передает ее в мою базу данных Firebird. Проблема в том, что jquery/ajax меняет символы вроде ä на Ã и так далее.
Сначала я подумал, что мне нужно закодировать обновление Firebird SQl с помощью бита ISO8859_1 (который использует таблица), затем я обнаружил, что это Jquery, который меняет символы.
Вот мой код:
?>
<div id="wrap">
<h3>Comment</h3>
<div id="status"></div>
<div id="content">
<div id="editable" contentEditable="true">
<?php
echo $row[21];
?>
</div>
<button id="save">Save</button>
</div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
<script>
$(document).ready(function() {
$("#save").click(function (e) {
var content = $('#editable').html()
var nr = <?php echo $s; ?>;
$.ajax({
url: 'save.php',
type: 'POST',
data: {
content: content,
nr: nr
},
success:function (data) {
if (data == '1')
{
$("#status")
.addClass("success")
.html("Data saved successfully")
.fadeIn('fast')
.delay(3000)
.fadeOut('slow');
}
else
{
$("#status")
.addClass("error")
.html("An error occured, the data could not be saved")
.fadeIn('fast')
.delay(3000)
.fadeOut('slow');
}
}
});
});
$("#editable").click(function (e) {
$("#save").show();
e.stopPropagation();
});
$(document).click(function() {
$("#save").hide();
});
});
</script>
5 ответов
Я решил это, просто используя перевод php перед отправкой значения в БД:
$ content2 = utf8_decode ($ content);
Чтение документации по jQuery.ajax;
По умолчанию [content-type] является "application/x-www-form-urlencoded; charset=UTF-8"
Другими словами, то, что вы публикуете на своей странице PHP, это строка в кодировке UTF-8. Если вы хотите что-нибудь еще (например, ISO-8859-1), вам нужно будет конвертировать его.
Как сказал Иоахим Исакссон, вы не можете отправлять данные в другой кодировке, кроме UTF-8.
Я обычно использую эту функцию в моем фронт-контроллере для преобразования всех $_POST
массив.
<?php
public function direct($POST)
{
if (!empty($_POST)) {
$flag_unicoded = false;
if (strpos(strtolower($_SERVER['CONTENT_TYPE']), 'charset=utf-8') !== false) $flag_unicoded = true;
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && strpos(strtolower($_SERVER['CONTENT_TYPE']), 'charset') === false) $flag_unicoded = true;
if ($flag_unicoded) {
function utf8_decode_recursive($input) {
$return = array();
foreach ($input as $key => $val) {
if (is_array($val)) $return[$key] = utf8_decode_recursive($val);
else $return[$key] = utf8_decode($val);
}
return $return;
}
$_POST = utf8_decode_recursive($_POST);
}
return $_POST;
}
}
?>
РЕДАКТИРОВАТЬ
Не проверено, но вы можете попробовать это:
jQuery.ajaxSetup({'beforeSend' : function(xhr) {xhr.overrideMimeType('charset=ISO-8859-1'); }});
Попытайся
$.ajax({
data: parameters,
type: "POST",
url: ajax_url,
timeout: 20000,
contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15",
dataType: 'json',
success: callback
});
Вы также должны указать кодировку на сервере.
<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?>
Обновите ответ снова после вашего комментария
Смотрите ниже URL, я думаю, что это очень важно для вас.
Как мне перекодировать строку JavaScript в ISO-8859-1
Я надеюсь, что это не выглядит как двойной ответ. У меня была эта проблема с приложением jsp. Страница была в iso-8859-1, но при использовании jquery.serialize() данные были повреждены при публикации из IE. Я видел предложение Абида Хуссейна выше, но изменил его на
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
например. сообщение серверу о том, что идет UTF-8, а не iso-8859-1 Это решило мою проблему.
$("#caleditform").submit(function(){
$.ajax(
{
url:$("#caleditform").attr('action'),
type: "POST",
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
data: $('#caleditform').serialize(),
success:function(html){
$('#projectdialog').html(html);
}
}
);
return false;
});
Спасибо