MB_STRCUT関数の関数は、マルチバイト文字列から指定されたバイト長の文字列フラグメントを傍受することです。 MB_Substrに似ていますが、違いは、 MB_STRCUTが文字ではなくバイト単位で傍受されることです。
<?php
$str = "これはテスト文字列です";
echo mb_strcut($str, 0, 6, "UTF-8"); // 出力“これはです”
?>
ここでは、 6がバイト数(UTF-8エンコード、漢字が通常3バイトを占める)数であるため、最初の2つの漢字が実際に傍受されます。
特殊文字は、絵文字、特別なシンボル、組み合わせた文字(ディクリティックノートのある文字など)などを指す場合があります。これらの文字は、UTF-8で3バイト以上を占める傾向があり、4バイト以上を占有することさえあります。
MB_STRCUTはバイト数に基づいて傍受されるため、インターセプトの長さがマルチバイト文字の切り捨てられた部分である場合、切り捨てられた文字列に文字化された文字または不完全な文字が表示されます。
例:
<?php
$str = "Hello ?? World";
echo mb_strcut($str, 0, 8, "UTF-8"); // 可能出力“Hello ”かかとは文字化けました
?>
これは4バイトを占める絵文字です。インターセプトされた長さが絵文字バイトの中央に落ちると、文字が切断され、その結果、コードが刻まれます。
PHP MB_STRCUT以来、MBSTRING拡張機能は4バイトの文字をより良くサポートしますが、インターセプトの長さと文字の境界に注意を払う必要があります。
質問 | 説明します | 解決 |
---|---|---|
キャラクターの切り捨ては、文字化けコードを引き起こします | 同じ長さでマルチバイト文字をカットして、文字列が不完全になります | 代わりにMB_Substrを使用し、文字ごとにインターセプトします |
4バイト文字処理例外 | 4バイトの絵文字は、傍受すると不完全です | PHPバージョンをアップグレードし、4バイトをサポートするmbstringを使用します |
バイトと文字の長さの混乱 | MB_STRCUTはバイトによって傍受され、 MB_SUBSTRは文字によって傍受され、混合すると間違いを犯すのは簡単です。 | 要件を明確にし、対応する関数を選択します |
キャラクターエンコーディングは一貫性がありません | 着信エンコードは、文字列の実際のエンコードと一致しないため、傍受例外になります | 文字列エンコードを確認し、正しく渡します |
MB_SUBSTRは文字によって傍受され、マルチバイトの半分のキャラクターを切り捨てることはなく、文字化けのコードを避けます。
<?php
$str = "Hello ?? World";
echo mb_substr($str, 0, 7, "UTF-8"); // 出力“Hello ??”
?>
MB_STRCUTを使用する必要がある場合は、インターセプトされたポイントが完全な文字境界であるか、 MB_STRLENを使用して文字の数を取得してから、対応するバイト数を計算するかを手動で検出することをお勧めします。
MB_STRCUTは、マルチバイトの文字列を扱うときに強力なツールですが、バイトで傍受するため、特殊文字(特に4バイトの絵文字)に遭遇すると、文字化けされたまたは切り捨てられた例外を生成する可能性があります。バイトと文字の違いを理解し、 MB_STRCUTまたはMB_SUBSTRを合理的に選択し、文字エンコードが一貫していることを確認することが問題を回避するための鍵です。