mysql 字符串长度计算实现代码(gb2312+utf8)

PHP对中文字符串的处理一直困扰于刚刚接触PHP开发的新手程序员。下面简要的剖析一下PHP对中文字符串长度的处理:

PHP自带的函数如strlen()、mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节。例:

$enStr = 'Hello,China!';
echo strlen($enStr); // 输出:12

而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8。utf-8能兼容更多的字符,所以受到很多站长的喜爱。gbk与utf-8对中文的编码不同,导致中文在gbk与utf-8编码下所占字节也有差异。

gbk编码下每个中文字符所占字节为2,例:

$zhStr = '您好,中国!';
echo strlen($zhStr); // 输出:12

utf-8编码下每个中文字符所占字节为3,例:

$zhStr = '您好,中国!';
echo strlen($zhStr); // 输出:18

那么如何计算这组中文字符串的长度呢?有人可能会说gbk下获取中文字符串长度除以2,utf-8编码下除以3不就行了吗?但是您要考虑字符串并不老实,99%的情况会以中英混合的情况出现。

这是WordPress中的一段代码,主要思想就是先用正则将字符串分解为个体单元,然后再计算单元的个数即字符串的长度,代码如下(只能处理utf-8编码下的字符串):


代码如下:

$zhStr = '您好,中国!';
$str = 'Hello,中国!';

// 计算中文字符串长度
function utf8_strlen($string = null) {
// 将字符串分解为单元
preg_match_all("/./us", $string, $match);
// 返回单元个数
return count($match[0]);
}
echo utf8_strlen($zhStr); // 输出:6
echo utf8_strlen($str); // 输出:9

utf8_strlen – 获得UTF8编码的字符串的长度


代码如下:

/*
* 用于UTF8编码的程序
* 获得字符串的长度,一个中文表示3个长度
* itlearner注释
*/
function utf8_strlen($str) {
$count = 0;
for($i = 0; $i < strlen($str); $i++){
$value = ord($str[$i]);
if($value > 127) {
$count++;
if($value >= 192 && $value <= 223) $i++;
elseif($value >= 224 && $value <= 239) $i = $i + 2;
elseif($value >= 240 && $value <= 247) $i = $i + 3;
else die('Not a UTF-8 compatible string');
}
$count++;
}
return $count;
}

(0)

相关推荐

  • 利用php+mysql来做一个功能强大的在线计算器

    找了很久,发现网上资料很少,于是想自己动手写,慢慢的发现问题多了,自己不怎么通算法,写一个计算式子短点还好,长了就挂了,再长点恐怕就要死机. 有一天做做mysql突然发现原来mysql功能这么强大,可以直接计算字符串...哈哈 这下可就高兴了. 代码还超级简单 就做了一个ajax的计算器 有式子错误提示 还可以时时显示输入的式子 有兴趣的朋友可以看看 更多的功能可以自己去开发 演示地址:http://www.jianlila.com/jsq.php jquer.js自己去下载 jsq1.php

  • SQL语句计算两个日期之间有多少个工作日的方法

    /* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -

  • SQL2005CLR函数扩展-深入环比计算的详解

    此类问题还可以延伸到类似进销存的批次计算中,这也要关注其他历史记录来决定当前某条记录的状态. sql语句无法简单实现mdx语句的类似功能,必须得用交叉表关联来对比.这里我们用CLR函数来实现mdx语句的类似语法.在select的时候把得到过的做个缓存就可以了.效率应该可以提高不少. clr的代码如下,编译为TestFun.dll,复制到sql服务器的文件目录下.--------------------------------------------------------------------

  • 在php和MySql中计算时间差的方法

    最近在研究自己爱围脖的时候就要计算到恋爱天数,这需要php根据每天的日期进行计算,下面就来谈谈实现这种日期计算的几种方法: (1) 如果有数据库就很容易了!若是MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可! 若是MYSQL那就用两个日期字段的差值计算的计算结果保存在另一个数值型字段中!用时调用便可! (2)如果没有数据库,那就得完全用php的时间日期函数! 下面主要说明之: 例:计算1998年5月3日到1999-6-5的天数: 复制代码 代码如下: $startdat

  • 用sql实现18位身份证校验代码分享 身份证校验位计算

    身份证校验码的计算方法 1.将前面的身份证号码17位数分别乘以不同的系数.第i位对应的数为[2^(18-i)]mod11.从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 : 2.将这17位数字和系数相乘的结果相加: 3.用加出来和除以11,看余数是多少?: 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字.其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2: 复制代码 代码如下: with

  • 如何计算多个订单的核销金额

    本文介绍了计算多个订单的核销金额的全部过程,运行数据库环境:SQL SERVER 2005,下面跟大家分享一下. 下图是一张订单明细表,现有金额要1700,根据订单单号的顺序依次对订单金额进行核销. 到支付订单6时,支付金额不足,只能支付200,后面订单的核销金额为0. 1.基础数据准备 CREATE TABLE #t ( id INT , dingdan VARCHAR(20), sale MONEY ) INSERT INTO #t VALUES (1,'a',100); INSERT IN

  • 通过SQLSERVER重启SQLSERVER服务和计算机的方法

    昨天和朋友在网上谈到SQL语句的应用,我朋友的远程服务器出现了无法连接的现象,问题的原因是远程服务器到达了最大连接数,为了实现远程重新启动,从而想到了用SQL语句命令实现这个功能,但是具体的命令格式给忘记了,找了点资料,把方法写在下面, 希望可以给大家一些帮助吧,呵呵 首先在本地计算机--创建重启脚本 复制代码 代码如下: declare @o int,@f int,@t int,@ret int exec sp_oacreate 'scripting.filesystemobject',@o

  • SQLSERVER 根据地图经纬度计算距离差示例

    SQL SERVER 根据地图经纬度计算距离的公式 复制代码 代码如下: go --创建经纬度距离计算函数 CREATEFUNCTION [dbo].[fnGetDistance] --LatBegin 开始经度 --LngBegin 开始维度 (@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNSFLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EAR

  • SQL计算字符串中最大的递增子序列的方法

    求字符串中最大的递增子序列 数据库环境:SQL SERVER 2005 如题,求字符串"abcbklmnodfghijkmer"中最大的递增子序列.这个字符串有点特别, 只由26个小写字母a-z组成. 大概思路如下: 1.将字符串转到一列存储,并生成行号 2.设置一个递增计数器列,默认为1,比较上下行的字符,如果在字典中的顺序是递增, 则计数器加1,否则,计数器置1 3.找出计数器最大的数及对应的行号,根据这2个数截取字符串 思路有了,下面直接贴代码 DECLARE @vtext VA

  • mysql 字符串长度计算实现代码(gb2312+utf8)

    PHP对中文字符串的处理一直困扰于刚刚接触PHP开发的新手程序员.下面简要的剖析一下PHP对中文字符串长度的处理: PHP自带的函数如strlen().mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节.例: $enStr = 'Hello,China!'; echo strlen($enStr); // 输出:12 而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8.utf-8能兼容更多的字符,所以受到很多站长的喜爱.gbk与

  • js计算字符串长度包含的中文是utf8格式

    方法一: 复制代码 代码如下: function byteLength(str) { var byteLen = 0, len = str.length; if( !str ) return 0; for( var i=0; i<len; i++ )  byteLen += str.charCodeAt(i) > 255 ? 2 : 1; return byteLen;} 说明:byteLength(str)参数:string str: 要计算字节长度的字符串(非ASCII的字符算2字节) 方

  • PHP字符串长度计算 - strlen()函数使用介绍

    strlen()函数和mb_strlen()函数 在PHP中,函数strlen()返回字符串的长度.函数原型如下: 复制代码 代码如下: int strlen(string string_input); 参数string_input为要处理的字符串. strlen()函数返回字符串所占的字节长度,一个英文字母.数字.各种符号均占一个字节,它们的长度均为1.一个中午字符占两个字节,所以一个中午字符的长度是2.例如 复制代码 代码如下: <?php echo strlen("www.sunch

  • Javascript 字符串字节长度计算函数代码与效率分析(for VS 正则)

    先看看一下两段代码吧,它们分别用for循环和正则表达式来检测字符串的字节长度: for循环检测字符串的字节长度方法一: 复制代码 代码如下: var lenFor = function(str){ var byteLen=0,len=str.length; if(str){ for(var i=0; i<len; i++){ if(str.charCodeAt(i)>255){ byteLen += 2; } else{ byteLen++; } } return byteLen; } els

  • PHP获取中英混合字符串长度的方法

    今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数. 复制代码 代码如下: $str = 'Hello world!';echo strlen($str); // 输出12 然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的.在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节. 复制代码 代码如下: $str =

  • PHP 字符串长度判断效率更高的方法

    有经验的程序员发现,php判断字符串长度,使用isset()在速度上比strlen()更快,执行效率更高.即: 复制代码 代码如下: $str = 'aaaaaa';if(strlen($str) > 6)VSif(!isset($str{6}) 用例子简单测试下,情况基本属实,isset()效率几乎是strlen()的3倍.示例: 复制代码 代码如下: <?php //使用strlen方式 $arr = "123456"; $sTime = microtime(1); i

  • golang 获取字符串长度的案例

    1.不同字符与获取字符串长度 获取字符串长度,是字符串操作的重要方法.理论来说,获取字符串长度,只要从头到尾查找一遍就可以了.但遗憾的是,不同字符具有不同的编码格式.拉丁字母一个字符只要一个字节就行,而中文则可能需要两道三个字节:UNICODE把所有字符设置为2个字节,UTF-8格式则把所有字符设置为1--3个字节. 因此,字符串长度的获得,不等于按字节数查找,而要根据不同字符编码查找. 2.golang中获取字符串长度的方法 对于中文开发者来说,经常需要对字符串进行长度判断.golang有自己

  • C语言多种获取字符串长度的方法

    在C语言中,想要获取字符串长度可以有很多方法,下面分别介绍 一.使用sizeof()运算符 在C语言中,sizeof() 是长度的运算符,括号中可以放入数据类型或者表达式,一般我们用来计算字符串长度. 基本用法: int i=10; sizeof(i);//表达式 char str[]="hello world"; sizeof(str); sizeof(double);//数据类型 在使用sizeof()求字符串长度时,会将 '\0' 也计算到字符串长度中.例如"abcd&

  • Mysql字符串字段判断是否包含某个字符串的2种方法

    假设有个表: 复制代码 代码如下: CREATE TABLE users(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),user_name VARCHAR(20) NOT NULL,emails VARCHAR(50) NOT NULL); 初始化表,并添加些记录. 复制代码 代码如下: truncate table users INSERT INTO users(user_name, emails) VALUES('小张','a@emai

  • php中计算中文字符串长度、截取中文字符串的函数代码

    在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务器,则只要在php.ini中开启即可.如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了. 以下几个函数用起来颇为顺手的.不过要知道,得在utf-8环境下使用. 复制代码 代码如下: header('Content-type:text/html;cha

随机推荐