多言語文字を含む大規模なテキストを処理する場合、PHPの文字列関数がマルチバイトエンコードをサポートしていない場合、文字や文字化けコードの切り捨てを簡単に引き起こすことができます。特に、大きなテキストを表示する必要があるシナリオでは、文字列を安全に傍受する方法が重要な問題になります。この記事では、 MB_STRCUT関数を使用して文字列ページネーションディスプレイを実装する方法を紹介します。これにより、文字の完全性が保証されるだけでなく、フロントエンドページネーションディスプレイも容易になります。
substr()はPHPの一般的な弦の切り捨て関数ですが、バイトで処理されます。テキストに中国語、日本、または韓国語などの多バイト文字が含まれている場合、 substr()は文字を簡単に切り捨てて、コードが文字化けします。対照的に、 MB_STRCUT()は、マルチバイト文字セット向けに設計された関数であり、文字が切り捨てられないようにしながらバイトによって文字列を安全に傍受します。
mb_strcut ( string $string , int $start [, int $length [, string $encoding ]] ) : string
$文字列:処理する文字列。
$ start :byte offsetを開始します。
$の長さ:インターセプトされたバイト数。
$エンコーディング:一般的にUTF-8を使用して、文字エンコード。
注: MB_STRCUT()はMB_Substr()とは異なります。これは、文字ではなくバイトの位置に基づいて文字列を傍受しますが、文字自体が切り捨てられないようにします。
1000バイトなど、ページごとに表示される最大バイト数を設定します。
MB_STRCUT()を使用して、対応するテキストを現在のページ番号でインターセプトします。
ページングの場合、ページの総数を決定するために、文字の合計長さを1ページあたりのバイト数で除算する必要があります。
function paginateText($text, $page = 1, $bytesPerPage = 1000, $encoding = 'UTF-8') {
$totalBytes = strlen($text);
$start = ($page - 1) * $bytesPerPage;
// 文字列を安全にインターセプトします,キャラクターの切り捨ては避けてください
$paginated = mb_strcut($text, $start, $bytesPerPage, $encoding);
// ページングデータを構築します
$totalPages = ceil($totalBytes / $bytesPerPage);
return [
'content' => $paginated,
'page' => $page,
'total_pages' => $totalPages
];
}
データベースに長い記事が保存されており、ユーザーにページごとにフロントエンドのページを読み取ることを望んでいるとします。
$fullText = file_get_contents('https://gitbox.net/static/long_article.txt');
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$result = paginateText($fullText, $page);
// 現在のページコンテンツを出力します
echo nl2br(htmlspecialchars($result['content']));
// ページネーションナビゲーション
for ($i = 1; $i <= $result['total_pages']; $i++) {
echo "<a href=\"?page=$i\">第 $i ページ</a> ";
}
mb_strcut()を使用する場合、テキストのエンコードが関数のエンコードパラメーターと一致していることを確認してください。
バイトの代わりに文字の数に基づいてページングする場合は、 mb_substr()を使用する必要があります。
実際に使用すると、特にテキストコンテンツが大きい場合は、キャッシュ戦略でパフォーマンスを最適化する必要があります。
文字列ページネーションディスプレイにMB_STRCUT()を使用することは、大規模なテキストコンテンツを処理するときにパフォーマンスとセキュリティをエンコードする方法です。それを通して、それは切り捨てられたキャラクターによって引き起こされる文字化けの問題を効果的に防ぐことができ、多言語のウェブサイトにより良いユーザーエクスペリエンスをもたらすことができます。この記事が、プロジェクトでより効率的に大規模なテキストページングの問題に対処するのに役立つことを願っています。