PHP封装中文函数

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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(76) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部