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编码的字符串的长度

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

PHP判断中文字符串的长度和字节长度相关推荐

  1. java 字符长度 中文_java判断中文字符串长度的简单实例

    话不多说,上代码: /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static i ...

  2. java判断字符长度_java判断中文字符串长度的简单实例

    话不多说,上代码: /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static i ...

  3. MySQL字符集编码中,VARCHAR 字符长度与字节长度的理解

    MySQL中基于 UTF-8 字符集编码,VARCHAR 字符长度与字节长度的理解 UTF-8 字符集 utf8mb4 字符集 参考 UTF-8 字符集 在 mysql 4.1 及之前早期版本中,如果 ...

  4. js判断中文字符串长度和js截取中文字符串

    //获取字符串长度String.prototype.strLen = function() { var len = 0; for (var i = 0; i < this.length; i++ ...

  5. java判断字符串长度_java判断中文字符串长度的简单实例

    /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static int length( ...

  6. 【字符串】字符串长度与字节长度

    字符串长度 : 字符串在遇到'\0'之前一共有几个字符 字节长度 : 字符串里出现的所有元素 例如:char str = '123abc\0123' 字符串长度:6 字节长度: 11 PS: 如果有汉 ...

  7. oracle查询值的字符串长度、字节长度、大小写字母转换

    1.||--拼接符 SELECT str1, str2,str1 | | str2 AS str_concat FROM 表名; 2 LENGTH--字符串长度 SELECT LENGTH('ab') ...

  8. 获取字符串长度、字符长度、字节长度

     示例: 字节长度.Value= System.Text.Encoding.Default.GetBytes(文本输入框1.Value).Length 字符长度.Value= len(文本输入框1 ...

  9. 数据库varchar类型长度是指字符长度还是字节长度呢?

    MySql 5.X 以上的版本的定义中表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符. 4.X 的版本表示的是字节长度,会根据字符集转变内容字节长度存储 ...

最新文章

  1. 使用 IntraWeb (8) - 系统模板
  2. log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?
  3. MySQL Concurrency Problems
  4. 执行 pip3 install selenium 时出现 fail to create process
  5. 相关的验证的正则表达式
  6. java运行环境简称_Java程序的运行环境简称之为
  7. CSocket文件传输 分段传输的关键代码
  8. 量子计算机完整的图片,记者带你走近世界首台超越早期经典计算机的光量子计算机(组图)...
  9. uva 1331——Minimax Triangulation
  10. 爬虫入门二(urllib,urllib2)
  11. Android网络编程5之OkHttp2.x用法全解析
  12. bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍
  13. SPSS 相关分析(图文+数据集)【SPSS 023期】
  14. 南阳理工acm 15括号匹配(二)
  15. 表白代码大全,快来向你的ta表白吧~~~
  16. 微信公众号和服务器的关系,微信公众号、订阅号、服务号之间的关系和区别
  17. Linux GDB的实现原理
  18. 路由器/交换机flow 调试指令
  19. 本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了
  20. cv2.VideoWriter()

热门文章

  1. Windows --- 微信内网可用,但浏览器外网无法连接
  2. 启用php client,RabbitMQ(二):安装 和 PHP Client
  3. 剑灵革命android汉化教程,剑灵革命手游中文界面怎么设置?台服中文界面设置教程...
  4. 主流的软件开发语言介绍
  5. 报错:RuntimeError: expected scalar type Double but found Float
  6. java共享文件夹SMB1服务报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/122.168.23.26
  7. 三极管Vbeo、Vceo的介绍
  8. eachart加单位
  9. 微信支付记录删除后怎么恢复?赶紧收藏这两个小技巧
  10. C#毕业设计——基于C#+asp.net+sqlserver的精品课程教学网站设计与实现(毕业论文+程序源码)——教学网站