[英]HTML Special Characters and Emojis Showing up Incorrectly on Laravel Webpage
我可能會做一些愚蠢的事情,並認為這很簡單。 我正在從外部 API 中提取數據,並通過我正在創建/保存的 Eloquent 模型將其直接存儲到數據庫中。
保存到數據庫字段中的數據如下所示: I Can't Believe It's A
- The field is using utf8mb4_unicode_ci
。
我的網頁有以下元數據:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
我通過我的 Laravel 刀片模板顯示它,如下所示:
<td>{{ $company->type->name }}</td>
我有點困惑我在這里做錯了什么? 從文檔和其他stackoverflow問題來看,我似乎做得正確。 我的config/database.php
具有以下內容:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => 'InnoDB',
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
我相信這一切都是正確的。 我在這里缺少什么嗎? 切換到使用未轉義的{!! !!}
{!! !!}
似乎導致內容仍然顯示相同。 我正在使用 Laravel v7.13.0
谷歌瀏覽器也報告它是 UTF-8 渲染的:
> document.characterSet
"UTF-8"
編輯:
這是獲取響應的示例以及返回的 JSON 名稱的樣子:
>>> $response = Http::withOptions(
[
'verify' => false,
'base_uri' => config('custom.torn_api_base'),
'timeout' => 5.0
]
)->get(
"company/79831",
[
'selections' => 'profile',
'key' => config('custom.torn_api_key')
]
);
=> Illuminate\Http\Client\Response {#3393
+"cookies": GuzzleHttp\Cookie\CookieJar {#3379},
+"transferStats": GuzzleHttp\TransferStats {#3418},
}
>>> $response->json()['company']['name'];
=> "👾 Button Mashers™"
^ 你可以在上面看到他們的 API 給了我與 UTF-8 編碼相同的字符串,這將在他們的網站上使用。
這是我創建 model 並將其保存到數據庫中:
$company = Company::updateOrCreate(
[
'id' => $tornPlayerData['job']['company_id']
],
[
'name' => $tornPlayerData['job']['company_name'],
'player_id' => $this->player->id,
'isOwner' => true
]
);
我也在記錄響應,下面是帶有表情符號的行之一:
Log::info("Updating company '{$company->name}'' now", ['company' => $company]);
laravel.log│[2020-06-22 00:43:52] staging.INFO: Updating company '👾 Button Mashers™'' now {"company":{"App\\Company":{"id":79831,"name":"👾 Button Mashers™","player_id":2141091,"updated_at":"2020-06-22T04:43:52.000000Z","created_at":"2020-06-22T04:43:52.000000Z"}}}
編輯 2:我只是手動復制並粘貼了Button Mashers™
的 Tinker output 以在關聯的數據庫行中name
。 現在網站顯示手動調整了一個正確的。 因此,Laravel 在存儲 API 的數據時似乎對它做了一些奇怪的事情,我不確定為什么會這樣。
編輯3:
使用HEX
查詢作為用戶在答案中提出的問題。
SELECT id,name,HEX(name) FROM `companies` WHERE id=60335
(60335, 'Pokey's Play House!', '506F6B657926233033393B7320506C617920486F75736521');
(60335, ''', '26233033393B');
第二個結果是我修改了Pokey's Play House!
只是'
所以你可以看到只有撇號的結果。
編輯4:
刀片模板:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Company Directory</title>
<!-- Fonts -->
{{-- <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">--}}
<!-- Styles -->
** Snipped some minor CSS away from here **
</style>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.css">
<!-- Scripts -->
<script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.js"></script>
<script type="text/javascript" charset="utf8">
**removed some datatables code from here for this paste**
</script>
</head>
<body>
<table id='directory-table' class='display'>
<thead>
<tr>
<th>Player Name</th>
<th>Company Name</th>
<th>Type</th>
<th>Rank</th>
<th>Positions</th>
</tr>
</thead>
<tbody>
@forelse ($companies as $company)
<tr>
<td>
<a href='https://www.example.
net/profiles.php?XID={{ $company->player->id }}'>
{{ $company->player->name }}
</a>
</td>
<td>
<a href='https://www.example.net/joblist.php#/p=corpinfo&userID={{ $company->id }}'>
{{ $company->name }}
</a>
</td>
<td>{{ $company->type->name }}</td> //THIS IS THE PROBLEM STRING HERE BEING OUTPUTTED
<td> {{ $company->rank }}</td>
<td> {{ $company->hired_employees }}/{{ $company->max_employees }}</td>
</tr>
@empty
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
@endforelse
</tbody>
</table>
</body>
</html>
在您的刀片中,嘗試使用以下語句進行打印:
{!! html_entity_decode($company->name) !!}
或者
<?php echo $company->name; ?>
關於在刀片中打印數據的官方文檔。
“HTML 實體”(例如'
)對於 web 頁面很有用,但不應該是您將內容存儲到數據庫中的方式。
可能是您轉換為實體兩次,一次是在存儲數據之前,一次是在 web 頁面上顯示時。 要進一步診斷問題,請獲取字符串的SELECT HEX(..)...
對我來說,這似乎是一個編碼問題。
您需要打開AppServiceProvider
並在boot method
中添加以下代碼:
Blade::setEchoFormat('e(utf8_encode(%s))');
希望這對你有用!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.