常见字符编码规律:
代码实现:
<?php
/**
* 截取中文字符串(GBK编码)
* @param $str GBK编码的字符串, 注意文件自身编码
* @param $start 开始索引值
* @param $length 截取长度
*/
function str_truncate_gbk($str, $start, $length=0) {
$byte_len = strlen($str); //字节长度
$char_len = 0; //字符长度
$substr_arr = array();
for($i = 0; $i < $byte_len; $i++) {
if(ord($str[$i]) > 0x81) {
$substr_arr[] = $str[$i] . $str[$i+1];
$i++;
} else {
$substr_arr[] = $str[$i];
}
$char_len++;
}
if($char_len <= $length) {
return $str;
}
return implode('', array_slice($substr_arr, $start, $length));
}
/*
字符集编码范围
第一字节范围 第二字节范围
gb2312 0xa1-0xf7 0xa1-0xfe
gbk 0x81-0xfe 0x40-0xfe 去除 **7f
big5 0xa1-0xf9 0x40-0x7e 0xa1-0xfe
*/
// BOM头:EFBBBF
/*
UTF-8 编码规律:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*/
UTF-8 编码实现:
<?php
/**
* 截取中文字符串(UTF-8编码)
* @param $str UTF-8编码的字符串, 注意文件自身编码
* @param $start 开始索引值
* @param $length 截取长度
*/
function str_truncate_utf8($str, $start, $length=0) {
$byte_len = strlen($str); //字节长度
$char_len = 0; //字符长度
$substr_arr = array();
for($i = 0; $i < $byte_len; $i++) {
$ascii = ord($str[$i]);
if(($ascii & 0x80) == 0) {
$substr_arr[] = $str[$i];
} else
if(($ascii & 0xE0) == 0xC0) {
$substr_arr[] = $str[$i] . $str[$i+1];
$i++;
} else
if(($ascii & 0xF0) == 0XE0) {
$substr_arr[] = substr($str, $i, 3);
$i += 2;
} else
if(($ascii & 0xF8) == 0XF0) {
$substr_arr[] = substr($str, $i, 4);
$i += 3;
} else
if(($ascii & 0xFC) == 0XF8) {
$substr_arr[] = substr($str, $i, 5);
$i += 4;
} else
if(($ascii & 0xFE) == 0XFC) {
$substr_arr[] = substr($str, $i, 6);
$i += 5;
}
$char_len++;
}
if($char_len <= $length) {
return $str;
}
return implode('', array_slice($substr_arr, $start, $length));
}