【问题标题】:PHP json_encode encoding accents in words [duplicate]PHP json_encode在单词中编码重音[重复]
【发布时间】:2017-03-24 16:46:42
【问题描述】:

我正在使用 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"}}}]}

EDIT 2:我使用的是 PHP 7.0 版本


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

【问题讨论】:

  • Deceze,如果那篇帖子中的答案对我不起作用,这不是重复的,你不觉得吗?
  • FWIW,这在任何最近的 PHP 版本中都无法重现:3v4l.org/6I1l4。要么输入的某些东西不像你想象的那样,要么你意外地运行在一个古老的 PHP 版本上。
  • 看看我的帖子怎么样?我什至发布了我当前 PHP 版本的打印。
  • 是的,在您进行编辑后,它并不完全是重复的。然而,再一次,它不能通过任何 PHP 7 的股票安装重现。您能否生成一个简单 最小示例代码,在任何默认 PHP 7 上显示此行为?
  • 我不会是第一次有人认为他们正在运行某个特定的 PHP 版本,而实际上他们的系统上正在运行一些其他 Web 服务器,并且他们的代码实际上是在古老的 PHP 上执行的。为了排除这一点,并排除 Opencart 正在做任何恶作剧,请提供一个任何人都可以在任何地方运行的示例,以证明特定的 PHP 版本正在产生特定的意外结果。

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


【解决方案1】:

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

像这样:

echo json_encode(
     $data ,
     JSON_UNESCAPED_UNICODE
);

【讨论】:

  • 忘了告诉我我试过没有成功。
  • 是的,那将是有价值的信息。那么您能否提供一个代码的最小示例以供进一步调试?
  • 看看我编辑的帖子。
【解决方案2】:

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

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

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

$json = json_encode($data, JSON_UNESCAPED_UNICODE);

【讨论】:

  • 也不起作用。我试过了。
  • 你使用的是什么版本的 PHP?
  • 第 7 版,请参阅我编辑的帖子。
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 2012-08-04
  • 2013-07-01
  • 1970-01-01
  • 2011-02-16
  • 2013-05-28
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多