はじめに
文字列を指定のバイト数で切り出す必要があり作成していたのですが、AIに聞いても想定する回答が返ってこずに苦労したため、備忘録として残します。
コード
切り出す文字列は1文字ずつ削除しています。文字列が長い場合はパフォーマンスが悪くなるためご注意ください。
// 文字列のバイト数を取得する
function getTextByte(string $text): int
{
$textByteArray = unpack('C*', $text);
$textByte = count($textByteArray);
return $textByte;
}
/**
* 文字列の先頭から、指定バイト数の文字列を切り出す
*
* @param string $text 切り出す文字列
* @param int $byte バイト数。デフォルトは0
* @param string $encoding 切り出す文字列の文字コード。デフォルトはUTF-8
*
* @return string 切り出した文字列
*/
function truncateByBytes(string $text, int $byte = 0, ?string $encoding = 'UTF-8'): string
{
if ($byte < 0) {
return '';
}
$truncatedText = $text;
$truncatedTextByte = getTextByte($truncatedText);
// 切り出すバイト数以下になるまで、最後の1文字を削除する
while ($truncatedTextByte > $byte) {
$truncatedText = mb_substr($truncatedText, 0, -1, $encoding);
$truncatedTextByte = getTextByte($truncatedText);
}
return $truncatedText;
}
まとめ
単純な文字数の切り出しは簡単ですが、バイト数での切り出しは少し面倒でした。バイト数は文字コードによって変わるため、その辺りも注意が必要です。
参考記事
バイト数チェックのサイト
最後に
GoQSystemでは一緒に働いてくれる仲間を募集中です!
ご興味がある方は以下リンクよりご確認ください。