Php 如何在没有mb strlen的情况下获得UTF-8字符串的长度?
我想在PHP代码中获得UTF-8字符串的长度,但不想在PHP中启用。 还有别的办法吗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현世界
同时,我不能使用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我不访问,因为我使用共享主机