: MB_STRCUTを使用して文字列をインターセプトした後、文字列コードが表示されるか、インターセプトされた文字列の最後の文字が不完全になります。
理由: MB_STRCUTは、文字ではなくバイトで文字列を傍受することです。インターセプトされた位置がマルチバイト文字の真ん中に落ちると、文字が破損し、したがって、文字化けしたコードが表示されます。
<?php
$str = "こんにちは,世界";
echo mb_strcut($str, 0, 5, "UTF-8");
// 出力が文キャラクター化けされる可能性があります,なぜなら“あなた”はい3バイト,“良い”はい3バイト,インターセプト5バイト会截断“良い”キャラクター
?>
エラー現象:傍受結果が正しくないか、出力が異常です。
原因:正しいエンコーディングが明示的に指定されていない場合、 MB_STRCUTは内部デフォルトエンコード(通常、 MB_INTERNAL_ENCODING( )の値を使用します。
<?php
$str = "こんにちは";
echo mb_strcut($str, 0, 4); // エンコードは指定されていません,默认可能不はい UTF-8,結果は異常です
?>
エラー現象:関数エラーまたは動作の異常。
原因: MB_STRCUT (String、Start Position)の最初の2つのパラメーターと3番目のパラメーター(インターセプトの長さ)は、整数または整数に変換できる値でなければならず、開始位置と長さを負にすることはできません(長さは省略できます)。非統合値または負の値を渡すと、エラーが発生します。
<?php
$str = "Hello World";
echo mb_strcut($str, "a", 5); // 開始位置は整数でなければなりません,传入キャラクター符串会出错
?>
MB_STRCUTはバイトによって傍受されるため、インターセプトの長さがマルチバイト文字を切り捨てないことを確認してください。一般的な方法は、最初にマルチバイト文字の長さを計算してから、必要に応じて対応するバイトの長さを傍受するか、 MB_SUBSTRを使用して代わりにキャラクターでインターセプトすることです。
<?php
$str = "こんにちは,世界";
// 使用 mb_substr 按キャラクター符インターセプト,避免截断キャラクター符
echo mb_substr($str, 0, 2, "UTF-8"); // 出力:こんにちは
?>
MB_STRCUTを使用する必要がある場合は、インターセプトされたバイト数が完全な文字の境界であることを確認してください。
<?php
$str = "こんにちは,世界";
$length = 6; // 3バイト * 2个キャラクター符
echo mb_strcut($str, 0, $length, "UTF-8"); // 出力:こんにちは
?>
デフォルトのエンコードの不一致によって引き起こされる問題を回避するには、 MB_STRCUT (通常は「UTF-8」」を呼び出すときは、キャラクターをエンコードするパラメーターを常に指定する必要があります。
<?php
$str = "こんにちは";
echo mb_strcut($str, 0, 6, "UTF-8");
?>
MB_STRCUTを使用する前に、着信開始位置と長さのパラメーターが非陰性整数であることを確認してください。 intval()やfilter_var()などの関数を介して変換と検証を入力して、エラーを回避できます。
<?php
$start = intval($_GET['start'] ?? 0);
$length = intval($_GET['length'] ?? 10);
$str = "Hello, 世界";
echo mb_strcut($str, $start, $length, "UTF-8");
?>
<?php
function safe_mb_strcut(string $string, int $start, int $length = null, string $encoding = 'UTF-8'): string {
// 開始位置と長さが非陰性整数であることを確認してください
$start = max(0, $start);
if ($length !== null) {
$length = max(0, $length);
}
// 获取キャラクター符串バイト长度
$byteLength = strlen(mb_convert_encoding($string, 'UTF-8'));
if ($start > $byteLength) {
return '';
}
if ($length === null) {
$length = $byteLength - $start;
} else if ($start + $length > $byteLength) {
$length = $byteLength - $start;
}
return mb_strcut($string, $start, $length, $encoding);
}
// 使用の例
$str = "こんにちは,GitBoxユーザー!";
echo safe_mb_strcut($str, 0, 9, "UTF-8"); // インターセプト前3个汉キャラクター
?>
上記の分析と例を通じて、 MB_STRCUTを正しく使用する鍵は次のとおりです。
文字エンコーディングを明示的に指定します。
パラメータータイプが正しく有効であることを確認してください。
バイトはマルチバイト文字によって切り捨てられていないか、文字でインターセプトする代わりにMB_Substrを使用しないことに注意してください。
これらのテクニックを習得した後、 MB_STRCUTはマルチバイト文字列を処理するときにより信頼性が高まり、一般的な間違いを避けます。