BeWithYou

胡搞的技术博客

  1. 首页
  2. PHP
  3. 实现GBK和UTF8的按字节截取

实现GBK和UTF8的按字节截取


今天遇到需要按字节截取GBK和UTF8字符串的需求。记录一下代码片段。

function substrMB($str, $minLen, $maxLen, $charset = "utf8", $append = false, $default = "") {
    $length = strlen($str);
    if ($length <= $minLen) {
        $str = $default;
    } elseif ($length <= $maxLen) {
        //DO NOTHING
    } else {
        $strLast = array();
        $i = 0;
        if ($charset == "utf8") {
            while ($i < $maxLen) {
                $strTmp = substr($str, $i, 1);

                if (ord($strTmp) >= 240) {//11110000
                    $strTmp = substr($str, $i, 4);
                    $i = $i + 4;
                } elseif (ord($strTmp) >= 224)//11100000
                {
                    $strTmp = substr($str, $i, 3);
                    $i = $i + 3;
                } elseif (ord($strTmp) >= 192) //11000000
                {
                    $strTmp = substr($str, $i, 2);
                    $i = $i + 2;
                } else {
                    $i = $i + 1;
                }
                if ($i > $maxLen) {
                    break;
                }
                $strLast[] = $strTmp;
            }
            $str = implode("", $strLast);
            if ($append) {
                $str .= $append;
            }
        } elseif ($charset == "gbk") {
            while ($i < $maxLen) {
                $strTmp = substr($str, $i, 1);
                if (ord($strTmp) > 127) {
                    $strTmp = substr($str, $i, 2);
                    $i += 2;
                } else {
                    $i++;
                }
                if ($i > $maxLen) {
                    break;
                }
                $strLast[] = $strTmp;
            }
            $str = implode("", $strLast);
            if ($append) {
                $str .= $append;
            }
        }
    }
    return $str;
}

思路是这样的:

UTF8编码的字符串看首字节,开头几个1就是几字节。

GBK编码的字符串看首字节,大于127的就是2字节的。

回到顶部