ISO8859_1中的Jquery AJAX传递变量

Posted

技术标签:

【中文标题】ISO8859_1中的Jquery AJAX传递变量【英文标题】:Jquery AJAX passing variable in ISO8859_1 【发布时间】:2012-10-14 17:20:45 【问题描述】:

我有一个 php 代码,它从 URL 参数中捕获一个变量,并通过一个 html edditbale 文本字段将其传递给 Jquery/Ajax,然后再传递给一个外部 php 代码,该代码将它传递给我的 Firebird DB。 问题是 jquery/ajax 正在将 ä 之类的字符更改为 ä 等等。

首先,我认为我必须使用 ISO8859_1(该表正在使用)位对 firebird SQl 更新进行编码,然后我发现它是更改字符的 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>

【问题讨论】:

我是按照我的方式做的:只需将此添加到您要提交到数据库的最后一个变量中:iconv("ISO-8859-1", "UTF-8", $content) ;这是最后一步:如何以字符集 ISO-8859-1 提交它??? 【参考方案1】:

我在将值发送到数据库之前通过简单地使用 php 翻译解决了这个问题:

$content2 = utf8_decode($content);

【讨论】:

【参考方案2】:

阅读jQuery.ajax documentation;

默认 [content-type] 是“application/x-www-form-urlencoded; charset=UTF-8”

换句话说,您发布到您的 PHP 页面的是一个 UTF-8 编码的字符串。如果您需要其他任何内容(如 ISO-8859-1),则需要对其进行转换。

【讨论】:

我该如何改变它?我已经尝试了几件事,但没有运气 @MichaelMüller 据我所知(如果我是的话,我相信我会被证明是错误的 :)),你不能(可移植地)更改 jQuery.ajax() 在帖子中使用的字符集,您必须将其转换为服务器端。 顺便说一句。我也有问题,它将换行符发布为 这应该首先是 但实际上在我的 firebird 数据库中是真正的换行符,如何解决这个问题?【参考方案3】:

试试看

$.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'); ?>

发表评论后再次更新答案

请参阅下面的网址,我认为这对您很重要。

如何将 javascript 字符串转码为 iso-8859-1

How do I transcode a Javascript string to ISO-8859-1?

【讨论】:

这对我不起作用,我确实在帖子行下放入了内容类型字符串,但我在哪里放置 php 字符集?这是使用错误字符集传递文本的行: var content = $('#editable').html() 我已经更新了我的答案。我提到了一个网址。请看一看。 我之前读过,但没有进一步了解。问题是我对 php 和 sql 的基本了解很少,但完全没有 jqery 技能。 对不起,我没有机会理解这一点。我尝试了无数的东西,但在我理解 java 合成器之前,我没有机会将这些例子翻译成我的。【参考方案4】:

正如 Joachim Isaksson 所说,您不能以 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'); );

【讨论】:

【参考方案5】:

我希望这不会显示为重复的答案。 我在一个jsp应用程序中遇到了这个问题。该页面位于 iso-8859-1 中,但使用 jquery.serialize(),从 IE 发布时数据会损坏。 上面看到了Abid Hussain的建议,不过改成

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;

);

谢谢

【讨论】:

以上是关于ISO8859_1中的Jquery AJAX传递变量的主要内容,如果未能解决你的问题,请参考以下文章

jQuery AJAX 调用搞乱了字符编码

代码内的 jQuery ISO-8859-1 编码

将 ISO-8859-1 转换为 UTF-8 [重复]

如何使用正确的字符编码在 jQueryMobile 1.3.1 中通过 AJAX 加载 ISO-8859-1 内容?

smarty 在 php 7.2 和德语变音符号上替换 ans ISO-8859-1 的问题

如何使用 iso_8859-1 在 C 程序中输出度数符号?