🐣
Laravel メールで1行1,000バイトを超えると文字化けするのに対処する
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