我正在尝试从数据库中获取一些需要 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 的回声功能:
Blade::setEchoFormat('e(utf8_encode(%s))');
我确保我的文档是 UTF-8 并且视图的<head>
包含 <meta charset="utf-8">
,我的数据库表也是 UTF-8,我尝试制作一个简单的 PHP 文件来通过 mysqli
查询数据库,结果很好。视图中的硬写特殊字符也没有问题。
还有其他事情要照顾或尝试吗?
由于十六进制是C3A3 E2809A C2B9 C3A3 C692 ...
,你有"双重编码"。 这通常是由...
- 客户端的字符编码为 utf8(良好);和
-
SET NAMES latin1
谎称客户有拉丁1编码; - 表中声明
CHARACTER SET utf8
(良好)的列。
你当时也做过utf8_encode()
吗?
事情是这样的。 对于第一个角色,您有E382B9
. 但是,通过说latin1
,这被视为E3 82 B9
,在拉丁语1中是ス
。 我们发送到表的这三个字符,动态转换为utf8
,如表/列定义所示:C3A3 E2809A C2B9
- 这 3 个字符的 utf8 十六进制。
通常,"双重编码"在阅读时会自我修复。 也就是说,从 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
不好。
如果您需要恢复数据,我冗长的字符集博客中有代码。
对不起;我不知道Laravel如何正确建立所有三个设置。 也许您可以在连接后不久让它执行SET NAMES utf8
。
这就是スーパーサンダーブレード
的Mojibake
通常它发生在
- 客户端中的字节以 utf8(良好)正确编码。
- 您可能默认连接了
SET NAMES latin1
(或set_charset('latin1')
或...)。 (应该utf8
。 - 表中的列可能
CHARACTER SET utf8
也可能没有,但应该是这样。
不要在代码中使用任何函数;它只会使弄清楚该做什么变得复杂。
抱歉,我不知道如何配置 Laravel以使用 utf8。
片假名不需要utf8mb4;我不知道汉字是否这样做。 因此,您可以考虑将MySQL设置从utf8切换到utf8mb4。