PHP json_encode编码单词重音

时间:2016-11-10 15:31:41

标签: php mysql utf-8 character-encoding opencart

我使用的是Opencart,虽然我基本上已经看到谷歌上关于这个主题的所有帖子,我无法弄清楚数据库为什么用非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. 格式
  5. 我使用$this->connection->set_charset("utf8");
  6. 我使用$this->connection->query("SET NAMES 'UTF8'");
  7. 我在数据库中保存json的字段具有排序规则utf8_bin
  8. 使用json_decode时,其编码错误
  9. 尝试json_encode($this->request->post, JSON_UNESCAPED_UNICODE);
  10. 因此,每当我在解码后显示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版

    enter image description here

    编辑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));

2 个答案:

答案 0 :(得分:1)

您可以在json_encode的{​​{3}}中传递的其中一个选项是JSON_UNESCAPED_UNICODE。这被描述为:

  

从字面上对多字节Unicode字符进行编码(默认为以\ uXXXX转义)。从PHP 5.4.0开始提供。

因此,如果你通过它,它应该有效,因为它可以防止它们被转义:

$json = json_encode($data, JSON_UNESCAPED_UNICODE);

答案 1 :(得分:1)

您必须使用 JSON_UNESCAPED_UNICODE 标志(请参阅documentation

像这样:

echo json_encode(
     $data ,
     JSON_UNESCAPED_UNICODE
);