我使用的是Opencart,虽然我基本上已经看到谷歌上关于这个主题的所有帖子,我无法弄清楚数据库为什么用非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'");
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版
编辑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));
答案 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
);