PHPの覚書です。
strlenとmb_strlenの違い
- strlen: バイト数を数えます。
- mb_strlen: 文字数を数えます。
- mb_strlen(“こんにちは”) は 5 を返します。
- mb_strlen(“Hello”) も 5 を返します。
$text = "あいうABC123";
echo strlen($text); // 出力: 15 (3*3 + 3 + 3 = 15バイト)
echo mb_strlen($text); // 出力: 9 (文字数を正確に数える)
UTF-8での文字のバイト数
- 英語(ASCII文字): 1バイト
- 日本語(ひらがな、カタカナ、漢字): 3バイト
- 一部の特殊文字や絵文字: 4バイト
mb_strwidthについて
- 文字の表示幅を考慮します。
- 半角: 1として数える
- 全角: 2として数える
$text = "あいうABC123";
echo mb_strwidth($text); // 出力: 12 (3*2 + 3 + 3 = 12)
スポンサーリンク
mb_strwidthは使えない?
パーフェクトじゃないけど、普通に使っているようですね。
今までmb_strlen()使ってて、文字数がおかしな時があったので、UTF-8を使う上で、非常にmb_strwidth()はありがたいです。ありがとうございます。ちょっとフォルダの中ををメタ的にファイルの単語を置換するツールが欲しくなりました。ちょっと手作業でフォルダの階層を移動してたので結構大変でした。
— いのたかさん (@takasan_ino) February 7, 2024
これ、mb_strimwidthで一発だった。笑
— 了🌊SWELL | Arkhe開発 (@ddryo_loos) August 5, 2019
(カウントはmb_strwidth)
今までずっとmb_substrばかり使ってて知らなかったのとても恥ずかしい…! https://t.co/8rf0DLSWZC
- mb_strwidthは全角文字を2、半角文字を1としてカウントしますが、これは必ずしも実際の表示幅と一致しません。
- 特に問題になるのは以下のような文字です:
- 結合文字(例:アクセント記号)
- 絵文字
- サロゲートペア(Unicode の拡張領域の文字)
mb_strwidthが間違える主なケース:
- 絵文字: 多くの絵文字は2とカウントされますが、実際の表示幅はより広いことがあります。
- 結合文字: アクセント記号などが別にカウントされ、実際の表示より広く見積もられることがあります。
- 一部の特殊な Unicode 文字: 表示幅が正確に判断できない場合があります。
mb_strwidthは多くの一般的なケースで十分に機能しますが、完璧ではありません。以下のように考えます:
a. 実用性:
- 通常の日本語テキストや英数字を扱う場合、mb_strwidthは十分に実用的です。
- 多くのWebアプリケーションやCMSでの使用には適しています。
b. 限界:
- 絵文字を多用するSNSアプリケーションや、多言語対応が必要な国際的なアプリケーションでは注意が必要です。
- 正確な表示幅が極めて重要な場合(例:厳密なレイアウトが要求される印刷物)には不適切かもしれません。
c. 代替案:
- より正確な幅計算が必要な場合、IntlCharクラスの使用や、実際のレンダリング結果を測定する方法を検討する必要があります。
- ただし、これらの方法はより複雑で、実装コストが高くなる可能性があります。
推奨アプローチ:
- まずはmb_strwidthを使用し、問題が生じた特定のケースに対してのみ、より複雑な解決策を適用することを推奨します。
- アプリケーションの要件と対象ユーザーを考慮し、必要に応じて精度と実装の簡便さのバランスを取ることが重要です。
コメント