簡體   English   中英

HTML 特殊字符和表情符號在 Laravel 網頁上顯示不正確

[英]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 '&#128126; Button Mashers&#8482;'' now {"company":{"App\\Company":{"id":79831,"name":"&#128126; Button Mashers&#8482;","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&#039;s Play House!', '506F6B657926233033393B7320506C617920486F75736521');

(60335, '&#039;', '26233033393B');

第二個結果是我修改了Pokey&#039;s Play House! 只是&#039; 所以你可以看到只有撇號的結果。

編輯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 實體”(例如&#039; )對於 web 頁面很有用,但不應該是您將內容存儲到數據庫中的方式。

可能是您轉換為實體兩次,一次是在存儲數據之前,一次是在 web 頁面上顯示時。 要進一步診斷問題,請獲取字符串的SELECT HEX(..)...

對我來說,這似乎是一個編碼問題。

您需要打開AppServiceProvider並在boot method中添加以下代碼:

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

希望這對你有用!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM