php截取等长UFT8中英文混合字串

由于需要,想实现“php截取等长UFT8中英文混合字串”,可是网上找了很多代码不是有乱码就是不能实现等长(以一个中文长度为单位,两个英文字母算一个长度,如‘等长’长度为2,‘UTF8’长度也是2)。

由于utf8编码时,中文为三个字节,英文为一个字节,用substr就会出现乱码,用mb_substr会出现上面的不等长问题,但不会有乱码;

我以字节为单位进行操作,简单实现了一个小程序。

只能在utf8编码是使用。

Php代码  

    /*utf8编码时截取等长中英文字串*/ //英文标点[.,\"\\?!:_‘]
    <?
    function substr_utf8($string,$start,$length)
    {       //by aiou
         $chars = $string;
         //echo $string[0].$string[1].$string[2];
         $i=0;
         do{
            if (preg_match ("/[0-9a-zA-Z]/", $chars[$i])){//纯英文
                $m++;
            }
        else {$n++;     }//非英文字节,
            $k = $n/3+$m/2;
            $l = $n/3+$m;//最终截取长度;$l = $n/3+$m*2?
            $i++;
        } while($k < $length);
         $str1 = mb_substr($string,$start,$l,‘utf-8‘);//保证不会出现乱码
         return $str1;
    }  

测试结果:

Php代码  

    $string = ‘第一次截取,mb_substr返回的是字符串宽度是按“字”来计算‘;
    $string1 = ‘第一次截取,返回的是字符串宽度是按“字”来计算‘;
    $string2 = ‘第A一D次截取,返回的12345是字符串宽度是按“字”来计算‘;  

1.

Php代码  

    echo substr_utf8($string,0,1).‘<br/>‘;
    echo substr_utf8($string,0,2).‘<br/>‘;
    echo substr_utf8($string,0,3).‘<br/>‘;
    echo substr_utf8($string,0,4).‘<br/>‘;
    echo substr_utf8($string,0,5).‘<br/>‘;
    echo substr_utf8($string,0,6).‘<br/>‘;
    echo substr_utf8($string,0,7).‘<br/>‘;
    echo substr_utf8($string,0,8).‘<br/>‘;
    echo substr_utf8($string,0,9).‘<br/>‘;
    echo substr_utf8($string,0,10).‘<br/>‘;
    echo substr_utf8($string,0,11).‘<br/>‘;
    echo substr_utf8($string,0,12).‘<br/>‘;
    echo substr_utf8($string,0,13).‘<br/>‘;
    echo substr_utf8($string,0,14).‘<br/>‘;
    echo substr_utf8($string,0,15).‘<br/>‘;
    echo substr_utf8($string,0,16).‘<br/>‘;
    echo substr_utf8($string,0,17).‘<br/>‘;
    echo substr_utf8($string,0,18).‘<br/>‘;
    echo substr_utf8($string,0,19).‘<br/>‘;
    echo substr_utf8($string,0,20).‘<br/>‘;  

第一

第一次

第一次截

第一次截取

第一次截取,

第一次截取,mb

第一次截取,mb_s

第一次截取,mb_sub

第一次截取,mb_subst

第一次截取,mb_substr

第一次截取,mb_substr返

第一次截取,mb_substr返回

第一次截取,mb_substr返回的

第一次截取,mb_substr返回的是

第一次截取,mb_substr返回的是字

第一次截取,mb_substr返回的是字符

第一次截取,mb_substr返回的是字符串

第一次截取,mb_substr返回的是字符串宽

第一次截取,mb_substr返回的是字符串宽度

2.

Java代码  

    $ss=‘1234567890abcdefghijklmnopqrst‘;
    echo Utf8Helper::substr_utf8($ss,0,1).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,2).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,3).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,4).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,5).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,6).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,7).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,8).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,9).‘<br/>‘;
    echo Utf8Helper::substr_utf8($ss,0,10);  

12
1234

123456

12345678

1234567890

1234567890ab

1234567890abcd

1234567890abcdef

1234567890abcdefgh

1234567890abcdefghij

长度都以汉字数为基准。

基本上每两个英文字母、数字、英文标点算作一个汉字长度。看上去效果还不错。

改进一下还可以做其它编码下的。

效率没做测试,还没有这概念。

php截取等长UFT8中英文混合字串,布布扣,bubuko.com

时间: 2024-10-25 06:14:16

php截取等长UFT8中英文混合字串的相关文章

【LeetCode每天一题】Longest Substring Without Repeating Characters(最长无重复的字串)

Given a string, find the length of the longest substring without repeating characters. Example 1:           Input: "abcabcbb"                              Output: 3                           Explanation: The answer is "abc", with the l

PKU 2406 Power Strings(KMP最长循环不重叠字串)

题意:给一个字符串S长度不超过10^6,求最大的n使得S由n个相同的字符串a连接而成,如:"ababab"则由n=3个"ab"连接而成,"aaaa"由n=4个"a"连接而成,"abcd"则由n=1个"abcd"连接而成. 利用KMP算法,求字符串的特征向量next,若len可以被len - next[len]整除,则最大循环次数n为len/(len - next[len]),否则为1.

截取字符串的长度(中英文)

} } return System.Text.Encoding.Unicode.GetString(list.ToArray()); } /// /// 要截取的字节数 /// ///输入的字符串 ///限定长度 ///是否需要省略号,true--需要,false--不需要 ///截取类型 ///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符 public static string CutString(string val

中英文混合字符串截取java

//截取字符串长度(中文2个字节,半个中文显示一个) public String subTextString(String str,int len){ if(str.length()<len/2)return str; int count = 0; StringBuffer sb = new StringBuffer(); String[] ss = str.split(""); for(int i=1;i<ss.length;i++){ count+=ss[i].getB

ASP如何计算中英文混合字符串长度和截取字符串

用ASP做网站的时候经常会碰到要截取字符串的情况.ASP中的Len函数不管是中文字符,还是英文字符,统统按一个单位来计算,由于一个中文字符的宽度是一个英文字符宽度的两倍,在中英文混合的情况下字符串实际占用的宽度就不好计算了,如果按照Len函数计算的长度来截取字符串截出来的效果也会长短不一,下面是按照一个汉字相当于两个英文字符来计算字符串长度和截取字符串的代码 计算中英文混合字符串的长度: [vb] view plaincopyprint? function getStringLen(str) o

无乱码截取字符串,中英文混合(转)

//无乱码截取字符串,中英文混合 function left($str, $len, $charset="utf-8"){ //如果截取长度小于等于0,则返回空 if( !is_numeric($len) or $len <= 0 ){ return ""; } //如果截取长度大于总字符串长度,则直接返回当前字符串 $sLen = strlen($str); if( $len >= $sLen ){ return $str; } if ( strtol

c#的中英文混合字符串截取

public class StringHelper     {         public static string GetSubString(string str, int len)         {             string result = string.Empty;// 最终返回的结果             int byteLen = System.Text.Encoding.Default.GetByteCount(str);// 单字节字符长度          

ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: 对于字符串的截取,truncate函数只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,一个中文的长度大致相当于两个英文的长度.此外,truncate不能同时兼容GB2312.UTF-8等编码. 解决方法:自

C#实现中英文混合字符串截取的方法

本文实例讲述了C#实现中英文混合字符串截取的方法,是C#字符串操作中非常常用的一个方法.分享给大家供大家参考之用.具体方法如下: 具体功能代码如下: /// <summary> /// 截取中英文混合字符串 /// </summary> /// <param name="text">字符文本</param> /// <param name="length">截取长度</param> /// &l