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

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

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

只能在utf8编码是使用。

    /*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;
}

测试结果:

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

1.

    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.

    $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中英文混合字串的更多相关文章

  1. 用C#截取指定长度的中英文混合字符串

    很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则 ...

  2. Lua截取utf-8编码的中英文混合字符串

    参考博客:UTF8字符串在lua的截取和字数统计[转载] 需求 按字面个数来截取子字符串 函数(字符串, 开始位置, 截取长度) utf8sub(,) = 好1世界哈 utf8sub(,) = 你好1 ...

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

    Given a string, find the length of the longest substring without repeating characters. Example 1:    ...

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

    题意:给一个字符串S长度不超过10^6,求最大的n使得S由n个相同的字符串a连接而成,如:"ababab"则由n=3个"ab"连接而成,"aaaa&q ...

  5. 用JS来实现于截取中英文混合字符串方法(转载)

    网站制作过程中,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是  ...

  6. JS实现中英文混合文字溢出友好截取功能

    在显示字符串的时候,避免字符串过长往往会对字符串进行截取操作,通常会用到js的 substr 或者 substring方法, 以及 字符串的length属性 substr() 方法可在字符串中抽取从 ...

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

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  8. javascript截取字符串(支持中英文混合)

    javascript截取字符串(支持中英文混合) <script type="text/javascript"> var sub=function(str,n){ va ...

  9. PHP获取中英文混合字符串长度及截取

    1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 *  ...

随机推荐

  1. 【ASP.NET Web API教程】2.3.2 创建域模型

    原文:[ASP.NET Web API教程]2.3.2 创建域模型 Part 2: Creating the Domain Models 第2部分:创建域模型 本文引自:http://www.asp. ...

  2. Spring Boot Mongodb

    Spring注解学习,有助于更好的理解下面代码: @ConditionOnClass表明该@Configuration仅仅在一定条件下才会被加载,这里的条件是Mongo.class位于类路径上 @En ...

  3. 介绍SAP预留函数创建搜索帮助

    紧接上一节介绍的SAP预定义的出口函数F4IF_SHLP_EXIT_EXAMPLE创建搜索帮助, 该函数主要有两个部分: Changing接口的参数属性如下: SHLP:搜索帮助的基础描述,包括搜索帮 ...

  4. rsync Backups for Windows

    Transfer your Windows Backups to an rsync server over SSH rsync.net provides cloud storage for offsi ...

  5. A Very Easy Triangle Counting Game

    题意:在圆上取n个点,相邻两个点之间连线,(注意,n和1相邻),然后所有点对(i ,i+2)相连,问能形成的不同的三角形有多少个? 思路:找规律 n=3,cnt=1; n=4,cnt=8; n=5 c ...

  6. 一个计算器的C语言实现

    今天在读<编译原理及实践>时.看到了一个简单的整数计算器的实现. 依照书上的思路,我略微进行了扩展: 1.从整数计算器扩展到小数计算器. 2.支持除法 3.支持空字符. 执行效果例如以下: ...

  7. K-means clustering (K-means聚类)

    问题: K-所有值聚类是无监督学习算法 设数据集.当中,. 如果这个数据能够分为类. 把这个问题模型化: , 当中代表第类的聚点(中心点.均值). 该模型能够用EM算法进行训练: 初始化,. E步:固 ...

  8. Thinkphp学习04

    原文:Thinkphp学习04 一.ThinkPHP 3 的输出      (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出   想分配变量可以使用as ...

  9. C#写的客户端连接 php的服务器端的小例子

    C#写的客户端连接 php的服务器端的小例子 php的server 端 <?php // server.php set_time_limit( 0 ); ob_implicit_flush(); ...

  10. Java并发编程--Fork/Join框架使用

    上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...