
マルチバイトの文字列を分割する場合、分割して壊れた文字列に結合させた文字列すべてが文字化けしてしまう。そうならないようにうまく分割させる。(壊れた文字列は削除する)
<?php
//-------------------------------------------------------------
//制限文字数以上をカットする関数(EUC-JPのみで使用可能)
//分割されたマルチバイト文字は強制削除する
//-------------------------------------------------------------
function cutStringEUC($str, $limitByte) {
$str = substr($str, 0, $limitByte);
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
$character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字
if(preg_match("/^($character+)/x", $str, $match) > 0) {
return $match[1];
}
return;
}
参考
http://www.din.or.jp/~ohzaki/perl.htm#Character