【问题标题】:Special characters with json in phpphp中带有json的特殊字符
【发布时间】:2017-08-07 13:42:11
【问题描述】:

我正在尝试获取数据库中的数据并以 json 格式显示它们。但是带有重音的单词是这样出现的:\u00f3。

我的代码是这样的: cidadeDao.php

<?php

class CidadeDAO {
    private $conexao;

    public function __construct() {
        $this->conexao = new Conexao();
    }

    public function consultarTodos() {

       // mysql_set_charset('utf8');
        $sql = "SELECT * FROM cidade";

        $resultado = mysqli_query($this->conexao->getCon(), $sql);

        return $resultado;
    }

}

?>

cidade.php

<?php

header("Content-Type: text/html; charset=UTF-8",true);

include '../Classes/Conexao.php';
include '../Classes/DAO/cidadeDao.php';

$cidadeDao = new cidadeDao();

$consulta = $cidadeDao->consultarTodos();

    for ($i = 0; $i < mysqli_num_rows($consulta); $i++){
        $linha = mysqli_fetch_array($consulta);

        $respostas [] = array (
            'id' => $linha['id'],
            'id_uf' => $linha['id_uf'],
            'cidade' => utf8_encode($linha['cidade'])
        );
    }

echo json_encode($respostas);
?>

当我检查生成的 json 时,它看起来像这样:

[{"id":"1","id_uf":"1","cidade":"Sorocaba"},
{"id":"2","id_uf":"5","cidade":"Niter\u00f3i"},
{"id":"3","id_uf":"1","cidade":"Tatui"},
{"id":"4","id_uf":"1","cidade":"Itu"}]

谁能帮帮我?

如何在php中处理带有重音和特殊字符的单词?

【问题讨论】:

  • 似乎是什么问题?当json_decoded 他们应该变成他们以前的任何地方。并且前端 JS 应该正确显示它们。
  • 您正在使用的 php 函数 utf8_encode 可以做到这一点,但您期待什么?这就是它应该的样子。
  • 在我的 json 中它应该是这样的: [{"id":"1","id_uf":"1","cidade":"Sorocaba"}, {"id ":"2","id_uf":"5","cidade":"Niterói"}, {"id":"3","id_uf":"1","cidade":"Tatui"}, { "id":"4","id_uf":"1","cidade":"Itu"}] @DainisAbols
  • 不,它不应该是那样的,那不是json way
  • 但是由于它在来自数据库的单词中有一个特殊字符,我无法转换整个单词。 @DainisAbols

标签: php mysql json


【解决方案1】:

来自PHP Manual page on JSON Constants(你真的应该从那里开始)

JSON_UNESCAPED_UNICODE

对多字节 Unicode 字符进行逐字编码(默认转义为 \uXXXX)。自 PHP 5.4.0 起可用。

所以

json_encode('Niterói', JSON_UNESCAPED_UNICODE);

http://php.net/manual/en/function.json-encode.php

编辑:另外请参阅 cmets,因为这种方法可能会出现问题(它实际上违反了 JSON 的 RFC)。

【讨论】:

  • 这很危险,因为在将数据从后端发送到前端时,编码丢失的风险很高。特别是在 API 和网站等不同服务器之间。以这种方式编码是有充分理由的。
  • 这回答了 OP 问题。我建议您的评论警告就足够了,但如果担心,他们也可以咨询tools.ietf.org/html/rfc7159。我建议按照他们的要求工作并且兼容的事情是他们或他们支付的人应该针对他们的具体情况解决的问题。不过感谢您的提示(我会在搜索之前对正在搜索的字符串进行编码,但我不会在搜索的任何地方存储 JSON)。
  • 我只是按照你的建议做了,它奏效了。非常感谢我这样做了:echo json_encode($respostas, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK); @MrMesees
【解决方案2】:
  • 您应该在每个文件的顶部使用mb_internal_encoding() 函数,并在其后使用the mb_http_output() 函数。

  • 您的数据库和表需要设置为utf8mb4 字符集和排序规则。

  • 要保存到数据库,请使用 htmlentities 并像这样htmlentities( $yourdata, ENT_QUOTES | ENT_HTML5, $encoding = 'UTF-8' );

  • 精确 UTF-8

你必须添加这个才能访问 mysqli 的数据库:

$conn->set_charset('utf8mb4');
mysqli_set_charset($conn, 'utf8mb4');

阅读此处-- 以正确的方式使用 UTF-8,FROM PHP。 http://www.phptherightway.com/#php_and_utf8

  • 它解释了如何在 PHP 级别、数据库级别和浏览器级别以正确的方式使用 UTF-8。

【讨论】:

    【解决方案3】:

    这就是 JSON 的显示方式,但是一旦你使用任何你用来解码的东西来解码它,它就会看起来很好。所以Niter\u00f3i在JSON中会像这样出现,但是一旦你JSON Decode它,它就会显示为普通字符串Niterói

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2018-05-26
      相关资源
      最近更新 更多