【问题标题】:jQuery: UTF-8 not working with ajax requestjQuery:UTF-8 不适用于 ajax 请求
【发布时间】:2012-12-21 08:33:54
【问题描述】:

我有一个 php 文件,它使用 jQuery.ajax() 从另一个 php 文件中抓取一些数据到一个 div 中。

jQuery.ajax({
    type: 'POST',
    encoding:"UTF-8",
    dataType:"html", 
    contentType: "text/plain; charset=UTF-8",
    url: '/path/data.php',
    success: function(msg) {
        jQuery('#dataBox').html(msg);
    }
});

我的问题是,如果我通过 ajax 获取的数据中有一些“特殊”字符,例如 åäö,那么我会得到“黑色菱形中的问号”标记。如果我在浏览器中打开外部文件,它就可以工作。如果我在主页上放一些特殊字符,它就可以了。

一些简化的代码:

数据.php:

$mysqli = new mysqli("localhost", "username", "pass", "db");
$mysqli->set_charset("utf8");
$mysqli->query("SET GLOBAL time_zone = '+00:00'");
$stmt = $mysqli -> prepare("SELECT GROUP_CONCAT(sometext) AS mytext FROM `mytable`");
$stmt -> execute();
$results = selectResults($stmt);
$stmt -> close();
$mysqli -> close();

selectResults 函数:

function selectResults($stmt)
{
    $parameters = array();
    $results = array();

    $meta = $stmt->result_metadata();

    while ( $field = $meta->fetch_field() ) {   
     $parameters[] = &$row[$field->name]; 
    }

    call_user_func_array(array($stmt, 'bind_result'), $parameters);

    while ( $stmt->fetch() ) {
      $x = array();
      foreach( $row as $key => $val ) {
         $x[$key] = $val;
      }
      $results[] = $x;
    }

    return $results;

}

数据.php:

foreach($results as $result){
 $textArray = explode(',', $result['mytext']);
}
foreach($textArray as $text){
echo($text);
}

【问题讨论】:

  • 您的 PHP 脚本是否保存为 UTF8 文件?
  • 您可能需要对 ajax 调用返回的内容进行 utf8_encode。我已经能够自己用 å,ä,ö 解决同样的问题。
  • 检查您的 PHP 编码。你确定是UTF-8吗?您所描述的是编码不匹配的典型症状。
  • @roasted 是的,PHP 脚本保存为 UTF-8 文件。
  • 你不需要utf8_encode,这是一个临时解决方案,迟早会导致错误,因为它会很高兴地“双重编码”已经在 utf-8 中的字符串。 PHP 完全可以使用 UTF-8 编码的字符串。 utf8_encode 仅在基础数据采用 ISO-8859-1 时才有帮助,在这种情况下,您应该简单地更改基础数据的编码方式,而不是使用 utf8_encode

标签: jquery html ajax utf-8 character


【解决方案1】:

抱歉,如果您得到 unicode 替换字符 �,则输入已以 UTF-8 解释,但输入的原始字节与 UTF-8 不匹配,即它不是 UTF-8。

如果您在直接访问页面时看到正确的字符,那么一定是那些 ajax 参数强制对实际上采用其他某种编码的数据进行 UTF-8 解释,浏览器默认为 Windows-1252。

发布 php 代码和/或数据的原始字节。

【讨论】:

    【解决方案2】:

    通过在 data.php 文件中我 echo() 的数据周围设置 utf8_encode() 来修复它。没想到尝试这个,因为在浏览器中打开 data.php 时效果很好。

    编辑:

    utf8_encode() 移至 selectResults 函数,以便它对我从数据库中获取的所有值进行编码。

    【讨论】:

    • @Esailija 那我应该怎么做呢?
    • 显示代码,你的数据不是UTF-8。它在 ISO-8859-1 中,这就是 utf8_encode 起作用的原因。您希望您的数据以 UTF-8 开头,因此您不需要每次都使用utf8_encode
    • 我所做的只是使用 mysqli 连接到我的数据库。然后我通过一个 select 语句得到结果并将结果放入一个数组中。我在整个网站上都做同样的事情,但只是在使用 ajax 时它不起作用。
    • 您需要在进行任何查询之前执行$mysqli->set_charset("utf8");。这将使您收到的所有查询结果都采用 utf-8 格式。相信我,你不想考虑什么时候使用utf8_encode,什么时候不......你希望一切都是utf-8。
    【解决方案3】:

    我会写这个作为答案,因为它可能更容易帮助别人。

    要解决问题,您必须确保您输出的内容与 ajax 期望的内容相同,因此对于 utf-8,内容需要使用 utf-8 或编码为 utf-8

    utf8_encode($content);
    

    如果您可以像 Esailija 所说的那样从数据库中提供 utf-8 内容,您就不需要使用 encode-function。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 2014-04-26
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2013-12-14
      • 2016-03-21
      相关资源
      最近更新 更多