如何解决在UTF-8字符串上使用数组索引时输出错误
| 使用UTF-8字符串时遇到了问题。我想从字符串中读取单个字符,例如:$string = \"üÜöÖäÄ\";
echo $string[0];
我期望看到ü
,但我明白了-为什么?
解决方法
使用
mb_substr($string,1,\'utf-8\')
代替字符。
您的代码中发生的是表达式$string[0]
获得了字符串的UTF-8编码表示形式的第一个字节,因为PHP字符串实际上是字节数组(PHP在内部不识别编码)。
由于字符串中的第一个字符由一个以上的字节组成(UTF-8编码规则),因此实际上您只能获得该字符的一部分。此外,这些规则使您要检索的字节无效,无法单独作为字符站立,这就是为什么您看到问号的原因。
mb_substr
知道编码规则,因此不会天真地只给您一个字节。它将获得所需的数量来编码第一个字符。
您会看到$string[0]
仅仅通过以下方式给您一个字节:
$string = \"üÜöÖäÄ\";
echo strlen($string[0]);
mb_substr
还给您两个字节:
$string = \"üÜöÖäÄ\";
echo strlen(mb_substr($string,\'utf-8\'));
这两个字节实际上只是一个字符(为此您需要使用mb_strlen
):
$string = \"üÜöÖäÄ\";
echo mb_strlen(mb_substr($string,\'utf-8\'),\'utf-8\');
最终,正如Marwelln指出的那样,如果使用ѭ11来消除\'utf-8\'
的冗余,情况将变得更加容忍:
$string = \"üÜöÖäÄ\";
mb_internal_encoding(\'utf-8\');
echo mb_strlen(mb_substr($string,1));
您可以看到以上大部分内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。