ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【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;

外部システムと連携したりする時に便利なケースがあるので、覚えておきます。

down

コメントする