使用UTF-8字符串时遇到问题。我想从字符串中读取一个字符,例如:
$string = "üÜöÖäÄ";
echo $string[0];
我希望看到ü
,但我得到 - 为什么?
答案 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));