Я схожу с ума по этим вопросам кодирования …
Я использую json_decode
и json_encode
для хранения и извлечения данных. Я выяснил, что json всегда нужен utf-8. Нет проблем. Я даю json 'hellö' в utf-8, в моей БД он похож на hellu00f6
. Хорошо, код. Но когда я использую json_decode
, он не будет декодировать код обратно, поэтому у меня все еще есть hellu00f6
. Кроме того, в php 5.2.13 кажется, что в JSON по-прежнему нет факультативных тегов. Как преобразовать символы с кодовыми точками обратно в правильный специальный символ для отображения в браузере?
Greetz и спасибо
Maenny
Это может быть из-за обратной косой черты, предшествующей \u00f6
строке юникода JSON: ö
представляется \u00f6
. Когда вы храните в своей БД, СУБД не знает, как интерпретировать \u00f6
поэтому я думаю, что он читает (и сохраняет) его как u00f6
.
Вы используете функцию экранирования?
Попробуйте добавить обратную косую черту в unicode-экранах:
$json = str_replace("\\u", "\\\\u", $json);
Предыдущее сообщение уже объясняет, почему ваш пример не работал должным образом. Однако при работе с базами данных существуют хорошие методы кодирования, которые важны для повышения безопасности вашего приложения (т. Е. Предотвращения 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 для всех символьных данных, сохраненных или переданных пользователю, является разумным. Это упрощает разработку интернационализированных веб-приложений. Чтобы убедиться, что пользовательский ввод правильно отправлен в базу данных, использование функции эвакуации является хорошей идеей. В противном случае использование подготовленных заявлений облегчает жизнь и развитие и, кроме того, улучшает безопасность ваших приложений, поскольку SQL-Injection предотвращается.