PHP json_encode 对单词中的重音进行编码

标签 php mysql utf-8 character-encoding opencart

我正在使用 Opencart,虽然我基本上已经看过 google 上有关此主题的所有帖子,但我无法弄清楚为什么数据库以非 utf8 编码保存带有重音符号的字母。

print_r($this->request->post);

返回:Array ( [pfa_status] => 1 [pfa_text] => 'Cobrança' ); 但应用 json_encode 后,它变成:

{"pfa_status":"1","pfa_text":"Cobran\u00e7a"}

现在通过网络查看所有可能的解决方案:

  1. 我使用 <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  2. 我尝试过 header('Content-type: text/plain; charset=utf-8');
  3. 我的所有文件均采用 utf-8 without BOM 格式
  4. 我使用 $this->connection->set_charset("utf8");
  5. 我使用 $this->connection->query("SET NAMES 'UTF8'");
  6. 我在数据库中保存 json 的字段具有排序规则 utf8_bin
  7. 使用 json_decode 时,编码仍然错误
  8. 尝试了 json_encode($this->request->post, JSON_UNESCAPED_UNICODE);

因此,每当我在解码后显示 pfa_text 的值时,它都会显示 Cobran\u00e7a 而不是 Cobrança

我错过了什么?


编辑1:根据要求,这是我的代码,仅供测试之用。

class ControllerPfa extends Controller
{
    public function index()
    {
        if (($this->request->server['REQUEST_METHOD'] == 'POST')) 
        {
            $value = json_encode($this->request->post, JSON_UNESCAPED_UNICODE);
            print_r($value);

            die();
        }
    }
}

所以输出是(请注意,它是完整的当前 $_POST 响应):

{"pfa_status":"1","pfa_sort_order":"","pfa":[{"payment_method":"cod","description":{"1":{"name":"Tax"},"3":{"name":"Cobran\u00e7a"},"4":{"name":"Cobran\u00e7a"}}}]}

编辑2:我使用的是 PHP 7.0 版本

Reference: Why are my "special" Unicode characters encoded weird using json_encode?


EDIT 3:已解决,以下函数可以让单词完美地插入数据库中并带有重音符号。

private function formatEncoding($value)
{
    return preg_replace_callback('/\\\\u(\w{4})/', function ($matc) 
    {
        return html_entity_decode('&#x' . $matc[1] . ';', ENT_COMPAT, 'UTF-8');
    }, $value);
}

所以,我们所要做的就是调用 formatEncoding(json_encode($this->request->post));

最佳答案

您可以在 second parameter 中传递的选项之一json_encode 的值为 JSON_UNESCAPED_UNICODE。这被描述为:

Encode multibyte Unicode characters literally (default is to escape as \uXXXX). Available since PHP 5.4.0.

所以如果你通过了它,它应该可以工作,因为它可以防止它们被转义:

$json = json_encode($data, JSON_UNESCAPED_UNICODE);

关于PHP json_encode 对单词中的重音进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40531293/

相关文章:

php - 模式匹配统一的句子结构

php - 在 Windows Server 上将 Word Doc 文件转换为 PDF

python - Django 通过连接进行排序的效率 - 我可以强制使用子查询吗?

MySQL 从由第 3 个连接的 2 个表中选择(mysql 连接)

mysql - 在 Ubuntu 14.04 上读取 UTF-8 文件时发生 Flyway 错误 "Incorrect string value"

python - Unicode API 响应抛出错误 '' ascii' 编解码器无法编码字符 u'\u201 9' in position 22462'

php - 无法使用 Phalcon 从 MySql 返回汉字

php - 为什么 PHP 需要递归存储相同的全局数据?

php - 获取数组 php bigtee

mysql - 1) 无法在 DELETE SET NULL 或 ON DELETE CASCADE 上创建外键 2) 无法在 DELETE CASCADE 上创建外键