【发布时间】: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"}
现在通过网络查看所有可能的解决方案:
- 我用
<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"}}}]}
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