JSON specialchars JSON php 5.2.13

Я схожу с ума по этим вопросам кодирования …

Я использую 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 предотвращается.