Передача переменной 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

Как мне перекодировать строку 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;

});

Спасибо

Другие вопросы по тегам