PHP& MySQL:特殊字符:¨Ñ等

时间:2013-06-23 12:47:12

标签: php mysql json

您好我正在寻求帮助,因为我已经做了很多事情来正确显示数据库中的数据。我有一个设备,借助PHP脚本将数据插入MySQL数据库。所有数据都正确显示,但特殊数据(Ñ,ó,é等等)。我在服务器和设备之间使用JSON。 我做了很多改变,这些都是我得到的。首先它只显示了一个“?”而不是角色(我?aki)。后来它显示了整个字段的null,最后它显示没有写入特殊字符。 我做了以下更改,但没有成功: 在PHP脚本中:

header("Content-Type: text/html;charset=utf-8");
mysql_query("SET NAMES 'utf8'");

此外,在数据库中,字符串字段位于utf8_spanish_ci中,表格排序位于utf_unicode_ci中。

我不知道我还能做什么。如果我在数据库中插入一个新行,我可以在phpmyadmin和我的设备中完美地看到它。当设备将参数发送到服务器并且我认为php脚本不理解特殊字符时,会出现上述问题。

编辑:这是上面解释的PHP脚本的代码:

<?php

header("Content-Type: text/html;charset=utf-8");

// array for JSON response
$response = array();

// check for required fields
if (isset($_POST['nserie']) && isset($_POST['dni']) && isset($_POST['nombre']) && isset($_POST['bateria'])) {

    $nserie = $_POST['nserie'];
    $dni = $_POST['dni'];
    $nombre = $_POST['nombre'];
    $bateria = $_POST['bateria'];

    // include db connect class
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();

    // mysql inserting a new row

    $result = mysql_query("INSERT INTO candidatos(nserie, dni, nombre, bateria) VALUES('$nserie', '$dni', '$nombre', '$bateria')");
    $insertedId = mysql_insert_id();



    // check if row inserted or not
    if ($result) {
        // successfully inserted into database
        $response["success"] = 1;
        $response["message"] = $nombre;
        $response["id"] = mysql_insert_id();

        // echoing JSON response
        echo json_encode($response);

    } else {
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        // echoing JSON response
        echo json_encode($response);
        echo json_last_error();
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

谢谢

解决:最后我得到了解决方案,错误发生在Android应用中,其中没有设置utf-8。 这是改变:

DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

感谢Atri的解释

1 个答案:

答案 0 :(得分:4)

PHP根本不处理UTF-8。就它而言,UTF-8字符串只是普通的字节字符串,就像它处理的任何其他数据字符串一样。这不是问题,只要你不使用不知道如何在内部处理UTF-8的PHP函数搞乱字符串。

因此,如果您的设备正在向PHP发送有效的UTF-8字符串,而PHP只是将所述字符串传递给MySQL,那么您没问题。但是,如果在将它插入MySQL之前使用htmlentities之类的东西 - 并且没有正确设置函数的charset参数 - 那么你就麻烦了。 - 所以没有看到那些代码,我无法确定PHP脚本是否搞乱了数据。

多年来我在开发Unicode支持网站时多次注意到一件事:如果在phpMyAdmin中看起来正确,则UTF-8值是错误的。除非最近更新以支持它,否则phpMyAdmin不会执行UTF-8;只有Latin-1。我不相信你在那里看到的。 - 您可以通过手动设置浏览器使用的字符集来强制来显示正确的值。 (虽然不是100%肯定。)

我不明白的一件事。为什么要将内容类型设置为text/html?你没有说通过JSON进行通信吗?或者您是在通过PHP插入设备后查看网站上的数据?如果是这样,您需要确保指定HTML标记中的内容类型的<meta>标记也设置为正确的字符集。如果标记与它相矛盾,则设置HTTP标头是不够的。