PHP iconv_strlen()含义问题

8

我在想,以下这个句子对于我们这些蠢蛋来说是什么意思呢?

什么是字节序列?一个字节可以容纳多少个字符?

iconv_strlen()函数基于指定的字符集统计给定字节序列str中字符出现的次数,其结果不一定与字节长度相同。


1
计算字符数,而不是字节数。对于ASCII来说,字节和字符计数将是相同的。但请阅读下面的文章,它值得一看。 - user557846
4个回答

12

以日语字符'こ'为例。 假设使用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。那就是这个解释想要指出的。


3

1
一个字符串具有特定的字节长度。如果该字符串中的每个字符都由单个字节表示,则该字符串中的字符数将等于字节数。例如,对于英文字母来说,这是正确的。对于使用多个字节表示某些或所有字符的表示(即编码)来说,字符数将少于字节数。例如,不可能用一个字节表示所有可能的汉字。
因此,在给定编码的情况下,iconv_strlen会尝试计算字符串中字符的数量。字节序列是字符串中字节的顺序。对于包含中文的字符串,使用UTF8编码,你可能有一个20字节的字符串,其中包含14个字符。
如果一个字符由少于一个字节表示,那么它可能会更多。

0

iconv_strlen() 函数基于指定的字符集统计给定字节序列 str 中字符出现的次数,其结果不一定等同于字节长度。

  • 字节序列:另一个词是字符串,它是一系列字节(1字节=8位),例如:01011010 00011001 01101011。字节序列表示ABC等字符。
  • 字符集:也称为编码,指定一个字节如何映射到一个字符;例如,在ASCII字符集中,01000001表示A
  • 不一定与字节长度[…]相同:在ASCII字符集中,一个字节恰好代表一个字符。但并非所有字符集都是这样的;有些字符集使用两个、三个或更多字节来表示一个字符。这是因为一个字节只能容纳256个不同的值,而有些语言使用超过256个字符(如中文和日文)进行书写。Unicode甚至试图将所有人类语言的所有字符映射到单个字符集中,这需要每个字符超过一个字节的空间。

总之:

iconv_strlen() 函数计算给定字符串的字符数,考虑到字符集。因此,字符数可能不等于字节数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接