php获取utf8字符串的字符长度实例

 更新时间:2016年11月25日 17:06  点击:1779
今天没事来研究了一下在php中利用strlen计算字符串长度的一些实例了,但经过测试使用php自带的函数strlen在uft8与gbk编码时有很大的区别,下面我们一起来看看具体测试实例。


今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数。

 代码如下 复制代码


$str = 'Hello world!中';
echo strlen($str); // 输出12

测试一下中文

 代码如下 复制代码

$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18 www.111cn.net

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。

 

下面这个实例摘自大名鼎鼎的WordPress,非常精确的哦,另外需要注意的是本函数仅适用于utf-8 编码下的字符串。

 代码如下 复制代码


function utf8_strlen($string=null){
    // 将字符串分解为单元
    preg_match_all("/./us", $string, $match);
    // 返回单元个数  
    return count($match[0]);
}


但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍,于是我想到了这么一个办法:

 代码如下 复制代码

    $tmp = @iconv('gbk', 'utf-8', $str);
    if(!empty($tmp)){
    $str = $tmp;
    }
    preg_match_all('/./us', $str, $match);
    echo count($match[0]);

可兼容GBK/GB2312及UTF-8编码,经小量数据测试通过,但暂未确定是否完全正确

 

数据编码转换方法不能直接使用iconv函数来进行转换了,但我们可以利用iconv与var_export函数进行编码转换了,下面来看一个实例


用构建数组原型的序列化方法,借助var_export函数,最终函数如下:

 代码如下 复制代码

function array_iconv($in_charset,$out_charset,$arr){

return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';'));

}

原理很简单 var_export设置第二个参数为true,返回数组原型字符串,将字符串转换为utf-8编码,之后再用eval来执行返回(类似匿名函数?),至此完美解决问题。

一聚教程小编还有一个想法,就是利用foreach遍历数组然后再利用iocnv函数起先一个个转换了,不过这样转换的是把数组值进行转换了。

我们只要知道身份证的生成规则就可以了,像下面我们从指定位置到多少位就是出日期了,然后我们把日期转成时间戳然后进行加减运算就得出了年龄了,下面我们看实例。
 代码如下 复制代码

<?php
function getAgeByID($id){
       
//过了这年的生日才算多了1周岁
        if(empty($id)) return '';
        $date=strtotime(substr($id,6,8));
//获得出生年月日的时间戳
        $today=strtotime('today');
//获得今日的时间戳
        $diff=floor(($today-$date)/86400/365);
//得到两个日期相差的大体年数
       
//strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
        $age=strtotime(substr($id,6,8).' +'.$diff.'years')>$today?($diff+1):$diff;
 
        return $age;
    }
?>
如果让你大家操作数据库替换内容非常的简单,但是txt文件要如何操作呢,下面我来给大家分享了个替换实例。
 代码如下 复制代码

$file_path = '123.txt';
$content = file_get_contents($file_path);
//按换行符把全部内容分隔成数组
$con_array = explode("n", $content);
//替换掉指定行
    
$con_array[12]="123";
//组合回字符串
$con = implode("n", $con_array);
    
//写回文档
file_put_contents($file_path, $con);

在php中随机数据我们利用rand()或者mt_rand()来生成,要获取数组随机元素我们只要把rand(0,arr.length)这样,意思是起始为0,最大为数组长度即可。

昨天帮客户修改完侧边栏,以为终于可以透一口气了,结果临下班的时候,他居然又发消息过来,说需要在每篇文章下边加一个标签,随机显示他们公司的12个业务的广告词。确定了需求,那就动手吧。

其实蛮简单的,先预定义一个数组存储这12个广告词,如

 代码如下 复制代码

$option = array('广www.111cn.net词1','广告词2','广告词3','广告词4','广告词5');


然后随机生成一个下标,

 代码如下 复制代码

$index = rand(0, count($option)-1);
echo $option[$index];

一般情况下,为了扩展方便,最好是将这个数据存入数据库或者xml,不过思路是一样的。


除了上面办法我们可以使用array_rand() 函数,此函数数组中随机选出一个或多个元素,并返回。

例子 1

 代码如下 复制代码

<?php
$a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");
print_r(array_rand($a,1));
?>

输出:

b

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25