2020/11/09
- home Home »
- folder 技術系 »
- folder PHP »
【PHP】mb_strimwidth()を利用して「全角2・半角1」換算で文字列を丸めたお話
time 2019/11/10
PHPのお仕事で「半角:1バイト 全角:2バイト として、特定のバイト以内に文字列を丸める」という要件がありました。
「バイト数で丸める」というとmb_strcut()
が思いつきますが、文字コードがUTF-8の場合は全角文字のバイト数が文字によって異なるため、期待した結果になりません。
【コード】
<?php $name = 'アザラシアザラシアザラシ'; $name = mb_strcut($name, 0, 10); echo $name;
【出力結果】
アザラ
また、「文字列をUTF-8からS-JISに直した上でstrlen
を使う」方法を紹介しているサイトも多いですが、環境依存文字が来たらまずいので、この方法も避けたいです。
そこでmb_strimwidth()
を使いました。「半角を1、全角を2」として数え、指定した幅数以内に丸めた文字列を返す関数です。
https://www.php.net/manual/ja/function.mb-strimwidth.php
数え方がちょうど要件とマッチするので良い感じ。
【コード】
$name = 'アザラシアザラシアザラシ'; $name = mb_strimwidth($name, 0, 10); echo $name;
【出力結果】
アザラシア
ちなみにmb_strwidth()
という関数もあり、こちらは幅数を取得できます。
前述の関数と組み合わせて、「特定のバイト数以下であれば何もせず、超えていたら丸める」みたいな処理が書けますね。
$name = 'アザラシアザラシアザラシ'; if (mb_strwidth($name) <= 10) { echo $name; return; } $name = mb_strimwidth($name, 0, 10); echo $name;
外部システムと連携したりする時に便利なケースがあるので、覚えておきます。