SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

マルチバイト文字を含む文字列で、先頭から6バイト(以内のきりがよいところ)とそれ以降の文字列に分ける

以下、ソースはEUC-JPで書いたとする。

先頭から6バイト(以内のきりがよいところ)とそれ以降の文字列に分ける

$str = "aあア●★うえおかkこ";
$str1 = mb_strcut($str, 0, 6, 'eucjp-win');
$str2 = substr($str, strlen($str1));
var_dump($str1, $str2);

【結果】 string(5) “aあア” string(15) “●★うえおかkこ”

半角のアはEUCだと2バイトです。

先頭から mb_strmwidth() の言う6文字分の幅に収まる文字列とそれ以降の文字列に分ける

$str = "aあア●★うえおかkこ";
$str1 = mb_strimwidth($str, 0, 6, "", 'eucjp-win');
$str2 = substr($str, strlen($str1));
var_dump($str1, $str2);

【結果】 string(9) “aあア●★” string(11) “うえおかkこ”

mb_strimwidth() で、●や★が幅1と数えられるのは仕様です。
マニュアル参照) http://jp2.php.net/manual/ja/function.mb-strwidth.php

半角英数、半角カナを1、全角文字を2とする数え方で6文字分の幅に収まる文字列とそれ以降の文字列に分ける

$str = "aあア●★うえおかkこ";
$str1 = mb_convert_encoding(mb_strcut(mb_convert_encoding($str, 'sjis-win', 'eucjp-win'), 0, 6, 'sjis-win'), 'eucjp-win', 'sjis-win');
$str2 = substr($str, strlen($str1));
var_dump($str1, $str2);

【結果】 string(7) “aあア●” string(13) “★うえおかkこ”

Windowsのメモ帳で見たとおりの幅を知りたかったら、Shift_jisにしてバイト数を数える。
このおなじみの見た目の幅による結果を期待している場合が比較的多いと思います。

関連するメモ

コメント