在PHP开发中,中文函数封装是很常见的需求之一,特别是在国内的开发中,中文函数往往更能够满足用户的需求。当然,PHP本身的官方函数库已经内置了很多中文函数,但是有一些常用的中文函数并没有被内置,这时我们就需要自己进行封装。
下面是一些常用的中文函数封装:
#### 字符串截取函数
中文字符串的截取对于很多开发者来说是比较麻烦的问题。下面是一种常用的中文字符串截取函数:
```
/**
* 中文字符串截取
*
* @param string $str 要截取的字符串
* @param int $start 截取的起始位置
* @param int $length 要截取的字符长度
* @param string $charset 字符编码
*
* @return string
*/
function mbSubstr($str, $start=0, $length=null, $charset='UTF-8')
{
if(function_exists('mb_substr'))
{
return mb_substr($str, $start, $length, $charset);
}
elseif(function_exists('iconv_substr'))
{
return iconv_substr($str,$start, $length, $charset);
}
$charset = strtoupper($charset);
$retstr = '';
$tmpstr = '';
if(empty($length))
{
$length = strlen($str);
}
if($charset == 'UTF-8')
{
$n = 0;
$tn = 0;
$noc = 0;
while($n < strlen($str))
{
$t = ord($str[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126))
{
$tn = 1;
$n++;
$noc++;
}
elseif(194 <= $t && $t <= 223)
{
$tn = 2;
$n += 2;
$noc++;
}
elseif(224 <= $t && $t < 239)
{
$tn = 3;
$n += 3;
$noc++;
}
elseif(240 <= $t && $t <= 247)
{
$tn = 4;
$n += 4;
$noc++;
}
elseif(248 <= $t && $t <= 251)
{
$tn = 5;
$n += 5;
$noc++;
}
elseif($t == 252 || $t == 253)
{
$tn = 6;
$n += 6;
$noc++;
}
else
{
$n++;
}
if($noc >= $start)
{
break;
}
}
$n = $noc;
while($n < strlen($str))
{
$t = ord($str[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126))
{
$tn = 1;
$n++;
$retstr .= $str[$n-1];
}
elseif(194 <= $t && $t <= 223)
{
$tn = 2;
$n += 2;
$retstr .= substr($str,$n-2,2);
}
elseif(224 <= $t && $t < 239)
{
$tn = 3;
$n += 3;
$retstr .= substr($str,$n-3,3);
}
elseif(240 <= $t && $t <= 247)
{
$tn = 4;
$n += 4;
$retstr .= substr($str,$n-4,4);
}
elseif(248 <= $t && $t <= 251)
{
$tn = 5;
$n += 5;
$retstr .= substr($str,$n-5,5);
}
elseif($t == 252 || $t == 253)
{
$tn = 6;
$n += 6;
$retstr .= substr($str,$n-6,6);
}
else
{
$n++;
}
if(isset($length) && $noc >= ($start+$length))
{
break;
}
}
}
else
{
$len = strlen($str);
for($i=0; $i<$len; $i++)
{
$chr = ord($str[$i]);
if($chr >= 0 && $chr <= 127)
{
$retstr .= $str[$i];
}
else
{
$retstr .= chr($chr);
}
if(isset($length) && $i >= $length)
{
break;
}
}
}
return $retstr;
}
```
这个函数有四个参数:$str表示要截取的字符串,$start表示截取的起始位置,$length表示要截取的字符长度,$charset表示字符编码。
这个函数可以截取任意编码的字符串,包括中文、日文和韩文等。具体实现时,它首先判断系统中是否有mb_substr()函数或iconv_substr()函数可用,如果有就直接使用它们进行字符串截取。如果没有,则使用自己写的截取函数。
#### 中文字符串长度函数
中文字符串的长度与英文字符串的长度是不同的,中文字符的占位宽度要比英文的大很多。下面是一个常用的中文字符串长度函数:
```
/**
* 计算中文字符串长度函数
*
* @param string $str 要计算的字符串
* @param string $charset 字符编码
*
* @return int
*/
function mbStrlen($str, $charset='UTF-8')
{
if(function_exists('mb_strlen'))
{
return mb_strlen($str, $charset);
}
elseif(function_exists('iconv_strlen'))
{
return iconv_strlen($str, $charset);
}
$charset = strtoupper($charset);
if($charset == 'UTF-8')
{
$c = 0;
$i = 0;
$len = strlen($str);
while ($i < $len)
{
$chr = ord($str[$i]);
$c++;
if($chr & 0x80)
{
$c++;
$chr <<= 1;
while($chr & 0x80)
{
$c++;
$chr <<= 1;
}
}
$i++;
}
return $c;
}
else
{
return strlen($str);
}
}
```
这个函数同样可以计算任意编码的字符串。对于UTF-8编码的字符串,它通过对字符串调用ord()函数来分析字符串中包含的每个字符,然后计算总长度。
#### 数组转换为JSON格式的字符串函数
在Web开发中,经常需要将数组数据转换为JSON格式的字符串,供前端JS代码使用。PHP的json_encode()函数可以很容易地通过将数组转换为JSON格式字符串,但是如果数组中包含中文字符,就会出现乱码,下面是一个解决方案:
```
/**
* 数组转换为JSON格式字符串函数
*
* @param array $array 要转换的数组
* @param boolean $unencoded 是否编码中文字符
* @param boolean $htmlencoded 是否转义html字符,例如引号、尖括号等
*
* @return string
*/
function jsonEncode($array, $unencoded=false, $htmlencoded=false)
{
$array = toJSON($array, $unencoded);
$json = json_encode($array);
if($htmlencoded)
{
$json = htmlentities($json, ENT_QUOTES, 'UTF-8');
}
return $json;
}
//私有函数
function toJSON($input=null, $noescape=false)
{
if(is_null($input))
{
return 'null';
}
if($input === true)
{
return 'true';
}
if($input === false)
{
return 'false';
}
if(is_scalar($input))
{
if(is_float($input))
{
return floatval(str_replace(',', '.', strval($input)));
}
if(is_string($input))
{
return '"' . ($noescape ? $input : addslashes($input)) . '"';
}
else
{
return $input;
}
}
$assoc = false;
$i = 0;
foreach($input as $key=>$value)
{
if($key !== $i++)
{
$assoc = true;
break;
}
}
$result = array();
foreach($input as $key=>$value)
{
$result[] = toJSON($assoc ? $key : $i++, $noescape) . ':' . toJSON($value, $noescape);
}
if($assoc)
{
return '{' . implode(',', $result) . '}';
}
else
{
return '[' . implode(',', $result) . ']';
}
}
```
这个函数支持传入三个参数,$array表示需要转换的数组,$unencoded表示是否编码中文字符,$htmlencoded表示是否转义html字符,例如引号、尖括号等。这里调用了PHP内置的json_encode()函数将数组转换为JSON格式字符串,并且在返回之前对字符串进行了进一步的处理。
在封装中文函数时需要注意一些细节:
- 对于字符串操作的一些函数,如截取字符串、计算字符串长度等,需要根据不同的字符编码进行不同的处理。
- 在传递中文参数时一定要指定正确的字符编码参数,否则可能会导致程序异常。
- 对于一些典型的编程任务,例如数组到JSON的转换,在考虑中文编码问题时,同样需要考虑浏览器端接收到的JSON也需要正确的字符编码。
除了以上提到的中文函数,还可以根据需求进一步开发和丰富。做好封装中文函数的工作,不仅能够提高我们的工作效率,还能使代码更具可读性和可维护性,真正达到“少写代码,多思考”的效果。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复