MUGIJIRU.JP

Webエンジニアの雑談ブログ

(PHP4.0.6以上) 文字を特定のbyte数以内に収める

全角・半角文字の混在した文字列を特定のbyte数に収めるための便利な関数の紹介です。

公式Doc

PHP: mb_strcut - Manual

先頭から32byte以内で切り捨てる、みたいな処理を入れるなら下記のような感じになります。

<?php
$trimmed = mb_strcut($string, 0, 32);

ちなみに

色々やっているシステムに導入する場合は文字コードにも気を遣う必要があります。
たとえば、物流システムの出荷データcsvをシステムで作成する場面などが考えられます。
最終的にSHIFT-JISで利用されるデータで、作成するシステムはUTF-8だとするならば
文字コードによってbyte数は異なりますから、変換前にmb_structしても正しく収まりません。
最終的に利用される文字コード上での処理をしなければ
過剰/不十分な切り詰めになってしまうといったケースが考えられるからです。

上記関数を使うならば、とりあえずmb_convert_encoding等で取り扱いたい文字コードに変換すると良いと思います。
(文字コードの仕組みを熟知している人ならば色々と頭のいい変換方法があるかもしれませんがここでは触れません)

サンプル関数
<?php
/**
 * 特定のbyteに収まるように文字列を切り出す
 * mb_convert_encodingはそこそこリソースを使うのでデータ量に注意
 *
 * @param string  $str      文字列
 * @param integer $byte     収めたいバイト数
 * @param string  $encoding 最終的に出力する文字コード 
 * @param integer $start    開始位置
 *
 * @return trimされた文字列
 */
function mb_truncate_by_bytenum($str, $byte, $encoding = null, $start = 0)
{
    if ($encoding) {
        $str = mb_convert_encoding($str, $encoding);
    }

    $trimmed = mb_strcut($str, $start, $byte, $encoding ? $encoding : mb_internal_encoding());

    if ($encoding) {
        $trimmed = mb_convert_encoding($trimmed, mb_internal_encoding(), $encoding);
    }

    return $trimmed;
}