一个包含中英文的字符串如何获得它的自然长度

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

然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。

$str = ‘你好,世界!‘;
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18

而我们在判断字符串长度时往往需要判断的是字符的数量,而非字符串所占字节数,如在UTF-8下的这段PHP代码:

$name = ‘张耕畅‘;
$len = strlen($name);
// 输出 FALSE,因为在UTF-8下三个中文占9个字节
if($len >= 3 && $len <= 8){
 echo ‘TRUE‘;
}else{
 echo ‘FALSE‘;
}
<?php
/**
 * 获取包含中英文的字符串长度
 */
$str = ‘测试abc123‘;
echo strlen($str)."<br>";
echo mb_strlen($str,‘utf-8‘);
?> 

输出结果为12和8,PHP自带的函数strlen()是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节,而中文则不然,在gbk编码下每个中文字符所占字节为2,而在utf-8编码下每个中文字符所占字节为3,测试代码用的UTF-8编码,所以输出12,函数mb_strlen(string $str[,string $encoding = mb_internal_encoding()])需要扩展库mb_string.dll才能使用,第一个参数str是要检查长度的字符串,第二个参数encoding为字符编码,如果省略,则使用内部字符编码,函数返回具有encoding编码的字符串str包含的字符数,多字节的字符被计为1,如果给定的encoding无效则返回FALSE,所以输出结果为8。

时间: 2024-10-12 02:05:10

一个包含中英文的字符串如何获得它的自然长度的相关文章

编写一个python程序,从控制台输入一个包含整数的字符串,将字符串中的整数格式化为长度为10的格式,位数不足前面补0,例如:456格式化成0000000456,具体要求如下:1、不使用正则表达式。2、使用字典格式化字符串。3、将从控制台输入的字符串转换为字符串模板再进行格式化。4、最后在控制台输出字符串模板和格式经结果。

s = input("请输入一个包含整数的字符串:") s1 = '' number = '' index = 0 d = {} print(len(s)) for i in range(len(s)): c = s[i] if c.isdigit(): number += c else: if len(number) > 0: # ab34cd54ab45 ab{number0}cd{number1}ab s1 += "{{number{}:010}}".f

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

好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: 对于字符串的截取,truncate函数只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,一个中文的长度大致相当于两个英文的长度.此外,truncate不能同时兼容GB2312.UTF-8等编码. 解决方法:自

生成一个包含所有汉字的字符串 &quot;一&quot;字开始&quot;\4e00 到9fa5

/** *    生成一个包含所有汉字的字符串 "一"字开始"\4e00 到9fa5 *    思路: *    1.既然是包含所有,肯定是从一个字符,到另一个字符之间的所有字符 *    2.因为String对象每创建一个不一样的,都会开辟空间,避免浪费内存,用STringBuilder的拼接更好 *  3.因为是输出所有拼接后的问题,所以用循环 *  4.为了避免太多一行显示不下,50个一换行显示,所以需要一个计数器 * *  步骤 *  1.循环变量初始化,这里循环变量

c#生成一个某文本中不包含的随机字符串

//生成一个某文本中不包含的随机字符串 private static string GetRandomStr(string allStr) { int number; string resStr; do { resStr = string.Empty; Random random = new Random(); for (int i = 0; i < 9; i++) { number = random.Next(); number %= 36; if (number < 10) { numbe

java按给定字节数截取含有中英文的字符串

需求:按给定字节数截取含有中英文的字符串,最后一个字节如果截取的是中文则不截取,是英文则截取 实现代码如下(未进行空字符串或非法字节数等异常判断) 1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 /** 6 * Created by ycl on 2017-8-18 21:01:16. 7 */ 8 public class TestA { 9 public static

ASP如何计算中英文混合字符串长度和截取字符串

用ASP做网站的时候经常会碰到要截取字符串的情况.ASP中的Len函数不管是中文字符,还是英文字符,统统按一个单位来计算,由于一个中文字符的宽度是一个英文字符宽度的两倍,在中英文混合的情况下字符串实际占用的宽度就不好计算了,如果按照Len函数计算的长度来截取字符串截出来的效果也会长短不一,下面是按照一个汉字相当于两个英文字符来计算字符串长度和截取字符串的代码 计算中英文混合字符串的长度: [vb] view plaincopyprint? function getStringLen(str) o

vb.net中,如何把byte array还原成为包含中文的字符串

这个问题,在网上好找了半天,但说实在话,不得不说,现在的程序员,脑子都僵化了. 一个能解决的也没有. 这还不说,多数人指出应当两边都用UNICODE,不要用ASC 2码之类的.我想说,这些是人家问的吗?不懂就是不懂,要是我就这样,何必不懂还要瞎JB指挥? 但我要说,这正是知其然不知其所以然,正确的回答,永远是先解释完提出问题的人,然后解决之. 然后,如果你愿意画蛇添足,再加上自己的想法.不想多说了,正确的代码我放在这里: '====================================

dr-helper项目设计介绍(一个包含移动端和Web端的点餐管理系统)

一.源码路径 https://github.com/weiganyi/dr-helper 二.界面 通过浏览器访问Web服务,可以看到界面如下: ADT-Bundle编译工程生成dr-helper.apk,安装后可以看到应用界面如下: 三.背景 Java诞生后主要就是用于Web开发,随着Android的兴起,其在移动领域也应用广泛.我在学习了Java相关的一系列技术后,想找个项目来实际运用一下.因此我考虑可以基于Java相关的技术来构建一个包括移动端和Web端的餐厅管理系统,在这个项目里我会综合

c#的中英文混合字符串截取

public class StringHelper     {         public static string GetSubString(string str, int len)         {             string result = string.Empty;// 最终返回的结果             int byteLen = System.Text.Encoding.Default.GetByteCount(str);// 单字节字符长度