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

2022-08-31 00:46:37

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

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

我期待看到,但我明白了 - 为什么?ü


答案 1

用于改为获取字符。mb_substr($string, 0, 1, 'utf-8')

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

由于字符串中的第一个字符由多个字节组成(UTF-8 编码规则),因此您实际上只获取了该字符的一部分。此外,这些规则使您正在检索的字节无效,无法单独作为字符站立,这就是您看到问号的原因。

mb_substr知道编码规则,所以它不会天真地给你一个字节;它将根据需要获得尽可能多的字符来编码第一个字符。

您可以看到,它只为您提供了一个字节:$string[0]

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

While 会返回两个字节: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));

您可以看到上述大部分内容的实际效果


答案 2