我在想,以下这个句子对于我们这些蠢蛋来说是什么意思呢?
什么是字节序列?一个字节可以容纳多少个字符?
iconv_strlen()函数基于指定的字符集统计给定字节序列str中字符出现的次数,其结果不一定与字节长度相同。
以日语字符'こ'为例。 假设使用UTF-8编码,该字符是一个3字节的字符(0xE3 0x81 0x93)。让我们看看在使用strlen
时会发生什么:
$ php -r 'echo strlen("こ") . "\n";'
3
结果是3,因为strlen
计算的是字节数。但是,根据UTF-8编码,这仅仅是一个字符。这就是iconv_strlen
派上用场的地方。它知道在UTF-8中,这是一个字符,尽管它由3个字节组成。因此,如果我们尝试使用以下代码:
$ php -r 'echo iconv_strlen("こ", "UTF-8") . "\n";'
1
我们得到了1。那就是这个解释想要指出的。
"绝对最少每个软件开发者都必须了解的Unicode和字符集知识(无任何借口!)"
iconv_strlen()
函数基于指定的字符集统计给定字节序列str
中字符出现的次数,其结果不一定等同于字节长度。
字节序列
:另一个词是字符串,它是一系列字节(1字节=8位),例如:01011010 00011001 01101011
。字节序列表示像A
、B
、C
等字符。字符集
:也称为编码,指定一个字节如何映射到一个字符;例如,在ASCII字符集中,01000001
表示A
。不一定与字节长度[…]相同
:在ASCII字符集中,一个字节恰好代表一个字符。但并非所有字符集都是这样的;有些字符集使用两个、三个或更多字节来表示一个字符。这是因为一个字节只能容纳256个不同的值,而有些语言使用超过256个字符(如中文和日文)进行书写。Unicode甚至试图将所有人类语言的所有字符映射到单个字符集中,这需要每个字符超过一个字节的空间。总之:
iconv_strlen()
函数计算给定字符串的字符数,考虑到字符集。因此,字符数可能不等于字节数。