プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、文字列をbyte単位で切り出し
簡単だけど迷うのでご注意を(--)b

文字列をbyte単位で切り出すときに使う関数は

mb_strcut(対象文字列, 開始位置, 取得バイト数 [, エンコーディング])

です。

サンプルは例えばこんな感じφ(--)
<?php
    //エンコード
    $enc = "UTF-8";

    //切り出しバイト数
    $lenByte = 8;

    $str1 = "1234567890";
    $str2 = "12345";
    $str3 = "a12345";
    $str4 = "abc12345";

    //byte数で切り出すパターン(mb_strcut())
    for($i = 1; $i <= 4; $i++){
        $tmpStr = mb_strcut(${'str' . $i}, 0, $lenByte, $enc);
        print "str" . $i . "s|" . $tmpStr . "|e<br />\n";
    }
?>

実行結果はこんな感じφ(--)
str1s:12345678:e
str2s:12:e
str3s:a12:e
str4s:abc1:e

マルチバイト文字の途中でぶったぎっても
ちゃんと丸めてくれるのですね。
ありがたやー。

ここで注意(--)b

似たような関数で

mb_strimwidth(対象文字列, 開始位置, 丸める幅 [, 後ろに追加する文字, エンコーディング])

というのがあります。
こいつはバイト数ではなく「幅」で切り出すのでご注意ね。

「『幅』ってなんじゃらほい?」と思うかもしれませんが、
簡単に言えば「半角を1バイト、全角を2バイト」として扱うってことです。

こんなコードを書くとφ(--)
<?php
    //エンコード
    $enc = "UTF-8";

    //切り出しバイト数
    $lenByte = 8;

    $str1 = "1234567890";
    $str2 = "12345";
    $str3 = "a12345";
    $str4 = "abc12345";

    //幅で切り出すパターン(mb_strimwidth())
    for($i = 1; $i <= 4; $i++){
        $tmpStr = mb_strimwidth(${'str' . $i}, 0, $lenByte, "", $enc);
        print "str" . $i . "s|" . $tmpStr . "|e<br />\n";
    }
?>

こんな結果になりますφ(--)
str1s|12345678|e
str2s|1234|e
str3s|a123|e
str4s|abc12|e

ちなみに「mb_strcut()」の実行結果はこんな感じでしたφ(--)
str1s:12345678:e
str2s:12:e
str3s:a12:e
str4s:abc1:e

「mb_strcut()」の実行結果と、似ているけど微妙に違いますね。
※補足:UTF-8だと「あ」とか「い」は3byteです。

混乱を招く要素として「Shift-JIS」で扱う分にはどちらも同じ結果になります。

こんなコードを書くとφ(--)
<?php
    //エンコード
    $enc = "SJIS-win";

    //切り出しバイト数
    $lenByte = 8;

    $str1 = "1234567890";
    $str2 = "12345";
    $str3 = "a12345";
    $str4 = "abc12345";

    //byte数で切り出すパターン(mb_strcut())
    for($i = 1; $i <= 4; $i++){
        $tmpStr = mb_strcut(${'str' . $i}, 0, $lenByte, $enc);
        print "str" . $i . "s|" . $tmpStr . "|e<br />\n";
    }

    print "<br />\n";

    //幅で切り出すパターン(mb_strimwidth())
    for($i = 1; $i <= 4; $i++){
        $tmpStr = mb_strimwidth(${'str' . $i}, 0, $lenByte, "", $enc);
        print "str" . $i . "s|" . $tmpStr . "|e<br />\n";
    }

?>

こんな結果になるφ(--)
str1s|12345678|e
str2s|1234|e
str3s|a123|e
str4s|abc12|e

str1s|12345678|e
str2s|1234|e
str3s|a123|e
str4s|abc12|e

これは「Shift-JIS」の全角文字が基本的には2バイトだからです。
偶然の一致(--)b

実際には「byte数で取得するのはmb_strcut()」なのでご注意くださいね。
「mb_strimwidth()」は見た目の幅を揃えたい場合に使います。

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事