PHP 內建 substr() 截取中文易產生亂碼,以下提供處理 GB2312 與 UTF-8 的自訂函式。
function substr_for_gb2312($str, $start, $len = null) {
$totlelength = strlen($str);
if ($len === null) $len = $totlelength;
if ($len == 0) return "";
if ($len >= $totlelength && $start == 0) return $str;
if ($start > $totlelength) return "";
// 處理負數 start
if ($start < 0) {
if (abs($start) >= $totlelength) $start = 0;
else $start = $totlelength - abs($start);
}
// 確保起始位置不切分雙位元組字元
if ($start > 0) {
$i = $start - 1;
$flag = -1;
while ($i >= 0) {
if (ord(substr($str, $i, 1)) > 160) $flag = -1 * $flag;
else break;
$i--;
}
if ($flag == 1) { $start--; $len++; }
}
$str = substr($str, $start);
$totlelength = strlen($str);
// 處理負數 len
if ($len < 0) $len = $totlelength - abs($len);
if ($len <= 0) return "";
// 確保結束位置不切分雙位元組字元
$i = min($len, $totlelength) - 1;
$flag = -1;
while ($i >= 0) {
if (ord(substr($str, $i, 1)) > 160) $flag = -1 * $flag;
else break;
$i--;
}
if ($flag == 1) $len--;
return substr($str, 0, $len);
}
function substr_for_utf($str, $len) {
$new_str = array();
for ($i = 0; $i < $len; $i++) {
$temp_str = substr($str, 0, 1);
if (ord($temp_str) > 127) {
$i++;
if ($i < $len) {
$new_str[] = substr($str, 0, 3);
$str = substr($str, 3);
}
} else {
$new_str[] = substr($str, 0, 1);
$str = substr($str, 1);
}
}
return join($new_str);
}
function utf8_substr($string, $start, $length) {
preg_match_all('/[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF4][\x80-\xBF]{3}/', $string, $rs);
$out = '';
$size = count($rs[0]);
$end = $start + $length;
if ($end > $size) $end = $size;
for ($i = $start; $i < $end; $i++) {
$out .= $rs[0][$i];
}
return $out;
}
補充工具推薦:
更多 PHP 相關內容請參考本站專題:《PHP 數學運算技巧總結》、《PHP 操作 Office 文件技巧總結》、《PHP 陣列操作技巧大全》、《PHP 排序演算法總結》、《PHP 常用遍歷演算法與技巧總結》、《PHP 資料結構與演算法教程》、《PHP 程式設計演算法總結》、《PHP 正則表達式用法總結》、《PHP 運算與運算子用法總結》、《PHP 字串用法總結》及《PHP 常見資料庫操作技巧匯總》。
希望本文能對您的 PHP 程式設計有所幫助。