我正在使用 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"}
现在通过网络查看所有可能的解决方案:
- 我使用
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- 我尝试过
header('Content-type: text/plain; charset=utf-8');
- 我的所有文件均采用
utf-8 without BOM
格式 - 我使用
$this->connection->set_charset("utf8");
- 我使用
$this->connection->query("SET NAMES 'UTF8'");
- 我在数据库中保存 json 的字段具有排序规则
utf8_bin
- 使用
json_decode
时,编码仍然错误 - 尝试了
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/