4

我有一个 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();

选择结果函数:

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);
}
4

3 回答 3

3

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

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

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

于 2013-01-07T15:37:00.247 回答
2

通过设置utf8_encode()echo()在 data.php 文件中的数据来修复它。没有想过尝试这个,因为在浏览器中打开 data.php 时它工作正常。

编辑:

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

于 2013-01-07T15:42:06.647 回答
1

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

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

utf8_encode($content);

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

于 2013-01-07T15:48:21.527 回答