MB_STRCUTは、マルチバイト文字列を扱う際にPHPで非常に実用的な機能です。その主な機能は、マルチバイトストリングからバイトでサブストリングを傍受することです。ただし、文字列に絵文字などの特殊文字が含まれている場合、 MB_STRCUTを使用するには追加の注意が必要です。
mb_strcut(string $ string、int $ start、?int $ length = null、?string $ encoding = null):string
この関数は、バイトオフセット(文字オフセットではなく)に基づいて文字列を傍受します。
MB_Substrとは異なり、 MB_STRCUTは実際には「BYTE-SAFE」バージョンですが、カットオフされるマルチビート文字(絵文字など)に遭遇すると、完全な文字ではなく直接切り捨てられます。
例を見てみましょう:
<code> $ str = "hello ?? world!"; $ cut = mb_strcut($ str、0、9、 'utf-8'); echo $ cut; </code>あなたは出力がこんにちはと期待するかもしれません?? 、しかし、あなたは実際に壊れた文字列を見るかもしれません。これは?? UTF-8のエンコーディングは4バイト文字であり、 MB_STRCUTは中央バイトで切り捨てられる場合があります。
絵文字は通常、4バイト以下です(例:???????????文字の境界を考慮せずにバイトのみで切断する場合、表示される場合があります。
出力には違法な文字が含まれています。
ブラウザは、文字化けされたコードまたは質問マークとして表示されます。
データベースはエラーを報告する場合があります(特に厳密なモードで)。
JSONエンコードは失敗する可能性があります。
あなたの目標が絵文字を使用してテキストプレビューを表示することである場合(Weibo、コメントなどの内容の概要など)、次の方法を考慮することができます。
「文字」でインターセプトすることを気にしない場合は、 MB_SUBSTRを使用できます。これにより、文字の境界が壊れていないことが保証されます。
<code> $ str = "hello ?? world!"; $ preview = mb_substr($ str、0、7、 'utf-8'); echo $ preview; </code>これにより、壊れたバイトではなく、完全な文字が出力されます。
MB_STRCUTを使用することを主張する場合(たとえば、バイト数を制御するため)、切り捨て後に不完全な文字を定期的に除去することができます。
<code> $ str = "hello ?? world!"; $ cut = mb_strcut($ str、0、9、 'utf-8'); //違法なキャラクターの定期的なクリーニングを使用します
$ clean = preg_replace( '/[\ xc0- \ xff] [\ x80- \ xbf]*$/'、 ''、$ cut);
echo $ clean;
</code>
このコードは、最後に切り捨てられる可能性のある不完全なマルチバイト文字を削除しようとします。
PHPのINTL拡張機能は、複雑なマルチバイト文字の処理に適した文字境界検出を提供します。
<code> $ str = "hello ?? world!"; $ BRIBETERATOR = INTLBRIBITERATOR :: createCharacterInStance( 'en'); $ BRICHITERATOR-> SETTEXT($ STR); $ bytes = 0;
$ limit = 9;
$ pos = 0;
foreach($ brayiterator as $ boundary){
$ chunk = mb_substr($ str、$ pos、$ boundary -$ pos、 'utf -8');
$ chunkbytes = strlen($ chunk);
if($ bytes + $ chunkbytes> $ lime){
壊す;
}
$ bytes += $ chunkbytes;
$ pos = $ boundary;
}
$ preview = mb_substr($ str、0、$ pos、 'utf-8');
echo $ preview;
</code>
これにより、インターセプトの文字列は、バイトの制限の下でキャラクターでいっぱいになり、国際化プロジェクトまたは複雑なテキスト処理に適しています。
文字列に絵文字または他のマルチバイト文字が含まれている場合、 MB_STRCUTを使用して文字列を傍受するには特別な注意が必要です。
それはバイトによって傍受され、絵文字を破壊する可能性があります。
切り捨て後、違法なキャラクターを掃除するか、定期的な修理と組み合わせる必要があります。
MB_Substrの使用はより安全ですが、正確にバイトを制御しません。
Intl Breakiteratorを使用して、切り捨ての位置が合法であることを確認することをお勧めします。
ユーザーインターフェイス、データベースストレージ、インターフェイス出力などでの絵文字処理の整合性と互換性を必ずテストしてください。
キャラクター処理に関するベストプラクティスについては、ドキュメントを参照するか、 https://gitbox.net/dev/mbstringにアクセスしてください。