はじめに
業務でマルチバイト文字をバイト数を指定して取得する機会があり、そのときバイトの関係で文字化けしてしまったので、調査した結果を書いておきます。
コード
test.php
<?php
$input = "こんにちは";
// mb_strcut()を使用する例
$cut1 = mb_strcut($input, 0, 7, "UTF-8"); // 7バイトまで切り取る
$cut2 = mb_strcut($input, 0, 6, "UTF-8"); // 6バイトまで切り取る
$cut3 = mb_strcut($input, 0, 5, "UTF-8"); // 5バイトまで切り取る
// substr()を使用する例
$substr1 = substr($input, 0, 7); // 7バイトまで切り取る
$substr2 = substr($input, 0, 6); // 6バイトまで切り取る
$substr3 = substr($input, 0, 5); // 5バイトまで切り取る
// 結果を出力
echo "mb_strcut (7 bytes): " . $cut1 . "\n";
echo "mb_strcut (6 bytes): " . $cut2 . "\n";
echo "mb_strcut (5 bytes): " . $cut3 . "\n";
echo "substr (7 bytes): " . $substr1 . "\n";
echo "substr (6 bytes): " . $substr2 . "\n";
echo "substr (5 bytes): " . $substr3 . "\n";
動かしてみる
mb_strcut()を使うと、バイトのきりの良い所で文字を取得してくれるため文字化けしていません。
substr()の場合は、指定したバイト数まで取得しているため、文字化けする可能性があります。
php test.php
mb_strcut (7 bytes): こん
mb_strcut (6 bytes): こん
mb_strcut (5 bytes): こ
substr (7 bytes): こん�
substr (6 bytes): こん
substr (5 bytes): こ�