在Laravel 5中获取数据库条目时的编码问题

时间:2016-03-07 20:30:03

标签: php mysql encoding utf-8 laravel-5

我正试图从数据库中获取一些需要UTF-8编码文本的条目。但是文本只显示为スーパーサンダーブレード

目前从我的数据库中获取内容的方法是以下代码:

public function getDetails($title){
    $result = DB::select('SELECT * FROM `table` WHERE `title` = ?', [$title]);
    return view('details', ['details' => $result]);
}

我的观点代码是:

@foreach ($details as $detail)
                <li>{{ $detail->text }} </li>
@endforeach

我尝试使用AppServiceProvider中的以下内容覆盖Blade的echo函数:

Blade::setEchoFormat('e(utf8_encode(%s))');

我确保我的文档是UTF-8并且View的<head>包含<meta charset="utf-8">,我的db-table也是UTF-8,我试图创建一个简单的PHP文件到通过mysqli查询数据库,结果很好。视图中的硬写特殊字符也没问题。

还有其他需要照顾或尝试的事情吗?

2 个答案:

答案 0 :(得分:1)

由于十六进制为C3A3 E2809A C2B9 C3A3 C692 ...,因此您具有“双重编码”。这通常是由......引起的。

  • 客户端的字符编码为utf8(好);和
  • SET NAMES latin1声称客户端有latin1编码;和
  • 表中的列声明CHARACTER SET utf8(好)。

那时你还做过utf8_encode()吗?

发生了什么事。对于第一个字符,您有E382B9。但是,通过说latin1,被视为E3 82 B9,其中latin1为ス。我们发送到表中的三个字符,即时转换为utf8,如表/列定义所示:C3A3 E2809A C2B9 - 这3个字符的utf8十六进制

Normaly,“双重编码”“修复”自己阅读。这是从utf8到latin1的两个翻译的步骤相反,你回来

但显然其中一个翻译被忽略了。

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+--------------
| Variable_name            | Value
+--------------------------+--------------
| character_set_client     | utf8          **
| character_set_connection | utf8          **
| character_set_database   | latin1
| character_set_filesystem | binary
| character_set_results    | utf8          **
| character_set_server     | utf8mb4
| character_set_system     | utf8
| character_sets_dir       | ...
+--------------------------+------------

执行**时会同时设置三个SET NAMES utf8。但我认为你有一些混合物,可能是

| character_set_client     | latin1
| character_set_connection | latin1
| character_set_results    | utf8

不好。

如果您需要恢复数据,则my lengthy charset blog中有代码。

对不起我不知道Laravel如何正确地建立所有三个设置。也许你可以在连接后立即执行SET NAMES utf8

答案 1 :(得分:0)

这是スーパーサンダーブレード

的Mojibake

通常在

时发生
  • 客户端中的字节在utf8(正常)中正确编码。
  • 您可能默认与SET NAMES latin1(或set_charset('latin1')或...)相关联。 (应该是utf8。)
  • 表格中的列可能是CHARACTER SET utf8,也可能不是org.eclipse.jdt.core.dom.CompilationUnit.getPosition(int, int) ,但应该是这样。

不要在代码中使用任何功能;它只会弄清楚要做什么。

抱歉,我不知道如何配置Laravel以使用utf8。

片假名不需要utf8mb4;我不知道汉字是否有。因此,您可以考虑将MySQL设置从utf8切换到utf8mb4。