PHPでマルチバイト文字列を処理する場合、一般的に使用される関数はMB_STRCUTであり、バイト数に基づいて文字列を傍受でき、UTF-8などのマルチバイトエンコードされたテキストの処理に適しています。ただし、多くの開発者は、 MB_STRCUTを使用して文字列を傍受する場合にエンコードエラーに遭遇することがよくあり、結果を傍受したり、キャラクターの半分を切り捨てたりします。この記事では、エンコードのエラーを避けて実用的なヒントを共有するために、 MB_STRCUTを正しく使用する方法について詳しく説明します。
MB_STRCUTは、バイト長で文字列を傍受するためのPHPのマルチバイト文字列関数の1つです。 MB_Substrとは異なり、 MB_STRCUTは文字ではなくバイトに基づいて傍受されます。マルチバイトエンコードを扱うときに、傍受長をより正確に制御でき、切り捨てられたキャラクターが切り捨てられないようにします。
関数プロトタイプ:
mb_strcut(string $str, int $start, ?int $length = null, ?string $encoding = null): string
$ str :文字列を入力します。
$ start :開始位置、バイト数で計算されます。
$の長さ:インターセプトされたバイト数(オプション)。
$エンコーディング:文字列エンコード、内部エンコードはデフォルトで使用されます。
MB_STRCUTを使用して文字列をインターセプトすると、 $ startまたは$の長さがマルチバイト文字の中央で不適切に落ちた場合、切り捨てられた文字バイトが不完全であるため、文字化けコードが表示されます。特にUTF-8エンコーディングでは、漢字は一般に3バイトで構成されています。バイトを傍受する場合、開始点とエンドポイントが両方とも文字境界であることを確認する必要があります。
MB_STRCUTを呼び出すとき、文字列のエンコードを明示的に指定することは、一貫性のないデフォルトエンコードによって引き起こされる問題を回避するための最初のステップです。
$encoding = 'UTF-8';
$result = mb_strcut($str, $start, $length, $encoding);
インターセプトする前に、 MB_STRLENを使用して文字列文字の長さを取得して、 $ startと$の長さを範囲外から回避します。同時に、 MB_Substrを組み合わせて、半分の文字が切り捨てられないようにします。
$length = 10;
if (mb_strlen($str, $encoding) > $length) {
$result = mb_substr($str, 0, $length, $encoding);
} else {
$result = $str;
}
バイト数でインターセプトする必要がある場合は、最初にインターセプトされたバイト範囲に対応する文字の完全な数を計算し、次にMB_SUBSTRを使用してインターセプトします。
function safe_mb_strcut(string $str, int $start, int $length, string $encoding = 'UTF-8'): string {
$substr = mb_strcut($str, $start, $length, $encoding);
// mb_strcut 半分のキャラクターが切り捨てられる場合があります,トランスコーディングは、それが有効かどうかを確認します
if (mb_check_encoding($substr, $encoding)) {
return $substr;
}
// 不完全な場合,長さを減らします,完了するまで
while ($length > 0 && !mb_check_encoding($substr, $encoding)) {
$length--;
$substr = mb_strcut($str, $start, $length, $encoding);
}
return $substr;
}
$str = "これはテスト文字列です,中国語とEnglish";
$start = 0;
$length = 15; // バイトによる傍受
$result = safe_mb_strcut($str, $start, $length, 'UTF-8');
echo $result;
これにより、バイトの切り捨てによって引き起こされる文字化けの問題が回避されます。
MB_STRCUTは、バイトでマルチバイト文字列をインターセプトします。キャラクターの境界に注意して、キャラクターの半分が切り捨てられないようにしてください。
エンコードパラメーターを特定して、関数の動作が一貫していることを確認します。
傍受された結果のエンコーディングの整合性は、 MB_CHECK_ENCODINGと組み合わせて検証できます。
MB_STRLENとMB_SUBSTRを組み合わせると、文字の傍受が必要な場合に安全になります。
上記の手法を通じて、PHPでのマルチバイト文字列インターセプト中のエンコードエラーは効果的に回避でき、テキスト処理とユーザーエクスペリエンスの精度を確保できます。
<?php
function safe_mb_strcut(string $str, int $start, int $length, string $encoding = 'UTF-8'): string {
$substr = mb_strcut($str, $start, $length, $encoding);
if (mb_check_encoding($substr, $encoding)) {
return $substr;
}
while ($length > 0 && !mb_check_encoding($substr, $encoding)) {
$length--;
$substr = mb_strcut($str, $start, $length, $encoding);
}
return $substr;
}
$str = "これはテスト文字列です,中国語とEnglish";
$start = 0;
$length = 15;
echo safe_mb_strcut($str, $start, $length, 'UTF-8');
?>
PHP文字列処理について詳しく知りたい場合は、次のリソースにアクセスできます。
$url = "https://gitbox.net/php/manual/zh/function.mb-strcut.php";