由于需要,想实现“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. 让Delphi XE2程序支持UAC

    在win7下,开发的程序有的时候莫名其妙就不能正常工作了,其实都是因为权限不够,要想能够正常运行,就需要获得管理员权限,这就需要处理UAC.具体方法如下: 一,制作“uac.manifest”文件.新 ...

  2. javascript事件委托,事件代理,元素绑定多个事件之练习篇

    <ul id="parent-list"> <li id="post-1">item1</li> <li id=&qu ...

  3. 很好用的一个类:TJvAppXMLFileStorage

    以前写软件的时候,在处理软件配置信息的时候,总是要写很多重复的代码,把配置信息写到Ini文件当中.昨天到网上查了一下,发现JVCL中提供了一个非常好用的类TJvAppXMLFileStorage,可以 ...

  4. Dom4j SAXReader Constructors

    Dom4j读取xml:eg1: package xml; import java.io.File; import org.dom4j.DocumentException; import org.dom ...

  5. Android开发之搜Ya项目说明(3)

    项目 搜芽移动client ----seller,app,base三个包的简单说明 作者 曾金龙 Tel:18664312687 QQ :470910357@qq.com 时间 2014-10-14 ...

  6. WKE——Webkit精简的纯C接口的浏览器

    以前不知道有这个东西 https://github.com/cexer/wke http://blog.csdn.net/weolar/article/details/50383491 http:// ...

  7. java--ThreadPool线程池简单用法

    package com.threadPool; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent. ...

  8. HelloGithub

    <HelloGithub月刊>第一期   <HelloGithub月刊> 因为现在这个项目只有我自己做,只敢叫“月刊”,希望有志同道合者,快点加入到这个项目中来!同时,如果您有 ...

  9. HttpGet协议与正则表达

    使用HttpGet协议与正则表达实现桌面版的糗事百科   写在前面 最近在重温asp.net,找了一本相关的书籍.本书在第一章就讲了,在不使用浏览器的情况下生成一个web请求,获取服务器返回的内容.于 ...

  10. CentOS Kernel Source Install

    http://linuxmoz.com/centos-kernel-source-install/