1

我对这些编码问题感到疯狂......

我使用json_decodeandjson_encode来存储和检索数据。我发现的是,json 总是需要 utf-8。那里没问题。我在 utf-8 中给出 json 'hello',在我的数据库中它看起来像hellu00f6. 好的,代码点。但是当我使用时json_decode,它不会将代码点解码回来,所以我仍然有hellu00f6. 此外,在 php 5.2.13 中,JSON 中似乎仍然没有可选标签。如何将代码点字符转换回正确的特殊字符以在浏览器中显示?

问候和感谢

梅尼

4

2 回答 2

1

这可能是因为 JSON unicode 字符串中的代码点前面的反斜杠:ö被表示\u00f6。当存储在您的数据库中时,DBMS 不知道如何解释\u00f6,所以我猜它会将其读取(并存储)为u00f6.

您是否使用转义功能?

尝试在 unicode 转义字符上添加反斜杠:

$json = str_replace("\\u", "\\\\u", $json);
于 2010-07-13T15:52:53.103 回答
0

上一篇文章已经解释了为什么您的示例没有按预期工作。但是,在使用数据库时有一些很好的编码实践,这对于提高应用程序的安全性很重要(即防止 SQL 注入)。

以下示例旨在展示其中的一些实践,并假设 PHP 5.2 和 MySQL 5.1。(请注意,所有文件和数据库条目都使用 UTF-8 编码存储。)

本例中使用的数据库名为test,创建表如下:

CREATE TABLE `test`.`entries` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`data` VARCHAR( 100 ) NOT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_bin 

(请注意,编码设置为utf8_bin。)

它遵循用于两者的 php 代码,添加新条目和创建 JSON:

<?
$conn = new PDO('mysql:host=localhost;dbname=test','root','xxx');
$conn->exec("SET NAMES 'utf8'"); // Enable UTF-8 charset for db-communication ..

if(isset($_GET['add_entry'])) {
    header('Content-Type: text/plain; charset=UTF-8');
    // Add new DB-Entry:
    $data = $conn->quote($_GET['add_entry']);
    if($conn->exec('INSERT INTO `entries` (`data`) VALUES ('.$data.')')) {
        $id = $conn->lastInsertId();
        echo 'Created entry '.$id.': '.$_GET['add_entry'];
    } else {
        $info = $conn->errorInfo();
        echo 'Unable to create entry: '. $info[2];
    }
} else {
    header('Content-Type: text/json; charset=UTF-8');
    // Output DB-Entries as JSON:
    $entries = array();
    if($res = $conn->query('SELECT * FROM `entries`')) {
        $res->setFetchMode(PDO::FETCH_ASSOC);
        foreach($res as $row) {
            $entries[] = $row;
        }
    }
    echo json_encode($entries);
}
?>

$conn->quote(..)在将数据传递到数据库之前,请注意该方法的用法。如上一篇文章所述,使用准备好的语句会更好,因为它们已经完成了整个转义。因此,如果我们这样写会更好:

$prepStmt = $conn->prepare('INSERT INTO `entries` (`data`) VALUES (:data)');
if($prepStmt->execute(array('data'=>$_GET['add_entry']))) {...}

代替

$data = $conn->quote($_GET['add_entry']);
if($conn->exec('INSERT INTO `entries` (`data`) VALUES ('.$data.')')) {...}

结论:对存储或传输给用户的所有字符数据使用 UTF-8 是合理的。它使国际化Web应用程序的开发更加容易。为确保用户输入正确发送到数据库,使用转义函数是个好主意。否则,使用准备好的语句使生活和开发更加容易,并且进一步提高了您的应用程序安全性,因为 SQL 注入被阻止了。

于 2010-07-13T19:06:58.677 回答