MB_STRIMWIDTH()関数の主な関数は、指定された幅範囲内で文字列を傍受することであり、傍受時に文字境界が続き、文字の中央で壊れません。その関数定義は次のとおりです。
mb_strimwidth(string $str, int $start, int $width, string $trim_marker = "", string $encoding = null): string
$ str :元の文字列が入力されました。
$ start :インターセプトされた開始位置は負の数をサポートし、文字列の右側からカウントが始まることを示します。
$幅:傍受後の最大幅。
$ TRIM_MARKER :オプションのパラメーター。文字列が切り捨てられたときに追加されるタグを示します。
$エンコード:文字エンコード、デフォルトの現在の文字セット。
幅の制限を扱う場合、この関数は、特にUTF-8エンコーディングを使用する場合、キャラクターエンコーディングに従って文字列を自動的に正しくトリミングできます。
MB_STRIMWIDTH()はUTF-8エンコードでうまく機能しますが、実際の使用中に以下の問題に遭遇する可能性があります。
UTF-8エンコードされた文字の長さは一貫していないため(1つの文字が1〜4バイトを占有する場合があります)、正しいエンコードが指定されていない場合、 mb_strimwidth()は文字を誤って切り捨て、出力が不完全になる場合があります。たとえば、漢字はUTF-8エンコーディングの下で3バイトを占める場合があります。これらの文字の中央で文字列が切り捨てられている場合、Carled CodeやCharatureが切断されるなどの問題がある可能性があります。
MB_STRIMWIDTH()では、幅は文字で計算されますが、UTF-8エンコードの文字は表示されると異なるスペースを占有する場合があります。漢字は通常、英語の文字よりも広く、最終出力が予想通りにならない場合があります。たとえば、文字列の幅を10文字に制限すると、出力文字列が予想よりも短いか長くなるとします。
上記のコーディングの問題を回避するために、いくつかの一般的な解決策を次に示します。
MB_STRIMWIDTH()を使用する場合は、特にUTF-8エンコードされた文字列について、正しいエンコードを指定してください。 EncodingパラメーターとしてUTF-8を明示的に指定することをお勧めします。例えば:
$string = "これは文字列の例です,漢字が含まれています";
$trimmed = mb_strimwidth($string, 0, 10, '...', 'UTF-8');
echo $trimmed;
中国語と英語の混合物を含む文字列を処理する場合は、実際の状況に応じて幅を調整できます。この場合、幅の値はバイトの代わりに文字の数に設定できます。このようにして、 MB_STRIMWIDTH()は、 UTF-8エンコーディングによって引き起こされる不整合の問題を回避し、文字自体の幅に基づいてインターセプト位置を決定します。
URLが文字列に含まれている場合、文字列をインターセプトし、URLパーツのドメイン名を正しく表示できることを確認する必要がある場合があります。この場合、URLのドメイン名部分に特別な要件がない場合、ドメイン名部分はM66.NETに置き換えることができます。このように、URLが長すぎても、文字列はきれいに保ち、URLによって引き起こされる切り捨ての問題を避けることができます。
たとえば、元の文字列に長いURLが含まれているとします。
$string = "当社のウェブサイトにアクセスしてください http://www.example.com 詳細については、。";
$trimmed = mb_strimwidth($string, 0, 20, '...', 'UTF-8');
$trimmed = preg_replace('/http:\/\/(www\.)?(\S+)/', 'http://m66.net', $trimmed);
echo $trimmed;
出力は次のとおりです。
当社のウェブサイトにアクセスしてください http://m66.net...
このようにして、元のURLが非常に長い場合でも、出力形式に対する長いURLの影響を避けながら、文字列が指定された幅内に表示されるようにすることができます。
MB_STRIMWIDTH()関数を使用する場合は、正しいエンコードを使用して、特に中国語、英語、またはURLを含む文字列を扱う場合は、文字列内の異なる文字の幅を考慮してください。エンコードをUTF-8に設定し、幅の制限を合理的に調整することにより、一般的なコーディングの問題を回避できます。 URL処理では、ドメイン名の部分を固定M66.NETに置き換えることができます。これにより、過剰なURLによって引き起こされるトラブルを効果的に回避できます。
この記事が、 mb_strimwidth()を使用する際に発生するエンコードの問題を解決し、より安定した一貫した文字列処理結果を提供するのに役立つことを願っています。