🐣

Laravel メールで1行1,000バイトを超えると文字化けするのに対処する

2021/09/14に公開

Laravel に限った話ではないですが、メールで1行が極端に長い場合(1,000バイトだそうです)、メール本文が文字化けしたりしますね。
昔、素のPHPでこれに対処した事がありますが、やけに面倒だったのを覚えています。

長い1行を例えば100文字ごとに強制的に分割したりすればいい訳ですが、マルチバイトな文字だと、これが面倒な訳ですね。

で、Laravel的にはどんな解決策があるかと言うと、こんな感じだったりします。(Ver.8.13~)

    $str = 'あいうえおあいうえおあいうえおあいうえおあいうえお';

    $str = \Str::of($str)->split(5)->implode("\r\n");

これで、$str に5文字ごとに改行コードで区切られた文字列が入ります。(改行コードは適宜調整して下さい)

split() のこの機能は、Ver.8.13で追加されました。GitHub:ソース

(執筆時点では、この使い方はドキュメントには記載無し)

ところで、split() の実装を見ると

    public function split($pattern, $limit = -1, $flags = 0)
    {
        if (filter_var($pattern, FILTER_VALIDATE_INT) !== false) {
            return collect(mb_str_split($this->value, $pattern));
        }

        $segments = preg_split($pattern, $this->value, $limit, $flags);

        return ! empty($segments) ? collect($segments) : collect();
    }

最初の if 文です。第1引数が整数だったら、PHPの標準関数の mb_str_split() を呼び出して、コレクションにして返しているのみですね。

Laravelに限らず、PHP7.4以降であれば、mb_str_split() 関数を使えばいいって事ですね。
便利な世の中になったものです。

Discussion