Php 如何在没有mb strlen的情况下获得UTF-8字符串的长度?

Php 如何在没有mb strlen的情况下获得UTF-8字符串的长度?,php,Php,我想在PHP代码中获得UTF-8字符串的长度,但不想在PHP中启用。 还有别的办法吗 同时,我不能使用strlen()函数,因为我在UTF-8字符串中得到了错误的长度。那么,您必须自己编写它 UTF-8 简言之,UTF-8编码如下: 如果某个字节最左边的位是0,则它是单字节字符 如果某个字节最左边的位是1,则它是多字节字符的一部分。 如果1后跟另一个1数,则该字符占用的字节数等于1位数,后跟0位 否则,多字节字符的其余部分都以位10开头 例如,假设我们有以下字符串: Hëllo현世界

我想在PHP代码中获得UTF-8字符串的长度,但不想在PHP中启用。 还有别的办法吗


同时,我不能使用strlen()函数,因为我在UTF-8字符串中得到了错误的长度。

那么,您必须自己编写它

UTF-8 简言之,UTF-8编码如下:

  • 如果某个字节最左边的位是0,则它是单字节字符
  • 如果某个字节最左边的位是1,则它是多字节字符的一部分。
    • 如果1后跟另一个1数,则该字符占用的字节数等于1位数,后跟0位
    • 否则,多字节字符的其余部分都以位
      10
      开头

例如,假设我们有以下字符串:

Hëllo현世界
01000═ H-->以0开头,因此是单字节字符
11000011╦ ë-->以两个1开头,后跟0。Char占用2个字节。
║         此字节是2个字节中的第一个。剩下的1
║         字节必须以10开头。
10101011╝     --> 这是一个“延续”字节,必须以10开头。
是的,所以它是有效的。
01101100═ l-->此字节以0开头,因此它也是一个普通字节。
01101100═ L
01101111═ o
11101101╗     --> 从三个1位开始。因此,字符占用3个字节。
║         接下来的3-1=2字节必须以10开头
10011000╬ 현  --> 连续字节
10000100╝     --> 连续字节
01010111═ W-->正常字节
01101111═ o
01110010═ R
01101100═ L
01100100═ D
代码 只需计算不以位
10开始的所有字节就足够了。换句话说,如果字节不在128-191(含)范围内

$str=“Hëllo현世界”;
//ë占用2个字节
// 현 占用3个字节
//在一个像样的浏览器中,你可以看到11个字符(10个拉丁语,1个中文)
$len=0;
对于($i=0;$i=192){
$len++;
}
}
回显“字节数:”.strlen($str)。“\n”;
回显“字符数:”.$len;



PS:您不想启用多字节字符串有什么原因吗?

出于好奇可能会有所帮助:为什么您不想启用PHP提供的任何内容?也许会有帮助?@NicoHaase我不访问,因为我使用共享主机