在UTF-8字符串上使用数组索引时输出错误

时间:2011-06-11 11:56:11

标签: php arrays string utf-8 char

使用UTF-8字符串时遇到问题。我想从字符串中读取一个字符,例如:

$string = "üÜöÖäÄ";
echo $string[0];

我希望看到ü,但我得到 - 为什么?

1 个答案:

答案 0 :(得分:28)

使用mb_substr($string, 0, 1, 'utf-8')来取代角色。

代码中发生的是表达式$string[0]获取字符串的UTF-8编码表示的第一个字节,因为PHP字符串实际上是字节数组(PHP不是在内部识别编码。

由于字符串中的第一个字符由多个字节组成(UTF-8 encoding rules),因此实际上只能获得字符的一部分。此外,这些规则使您正在检索的字节无效,因此您可以看到问号。

mb_substr知道编码规则,所以它不会天真地只返回一个字节;它将获得编码第一个字符所需的数量。

您可以看到$string[0]只返回一个字节:

$string = "üÜöÖäÄ";
echo strlen($string[0]);

虽然mb_substr会给你两个字节:

$string = "üÜöÖäÄ";
echo strlen(mb_substr($string, 0, 1, 'utf-8'));

这两个字节实际上只是一个字符(你需要使用mb_strlen):

$string = "üÜöÖäÄ";
echo mb_strlen(mb_substr($string, 0, 1, 'utf-8'), 'utf-8');

最后,正如Marwelln在下面指出的那样,如果您使用mb_internal_encoding来摆脱'utf-8'冗余,情况会变得更加容忍:

$string = "üÜöÖäÄ";
mb_internal_encoding('utf-8');
echo mb_strlen(mb_substr($string, 0, 1));

您可see most of the above in action