即使包含在 utf-8 (vscode, php) 中,我的函数也不会返回一些字母

问题描述

它应该吐出字符串的每个字母,如果它在对象键之一中,但那些奇怪的字符 æø 等根本不显示,我得到的结果如下:ltkai。而不是:lætkaiø。

我正在使用 vscode 和 PHP(使用 scoop 安装)。

  • 我在 vscode 中尝试过使用 BOM 编码的 UTF-8 和 UTF-8。

  • 我已经使用了 Meta charset="utf-8"。

  • 我试过 charset="" header()。

  • 我使用 mbstring 扩展名来检测它是否是 utf-8,它总是注册为 utf 并显示带有循环和整个字符串的奇数字母, 但如果它在我的 if stmt 中, 它只是没有注册为 utf, 并且 utf_encode 不起作用(就像它已经将它们注册为 utf,然后对它们进行编码,然后返回更奇怪的字母)。

  • 我还在我的函数之外使用了 property_exists(),它在那里工作,但在内部仍然无效。

  • 我试过 utf_encode,但还是不行。

    $name = 'lætkaiø';
    $vocals = (object) ['æ' => 4,'i' => 3,'ø' => 3,'a' => 4];
    $konsonants = (object) ['t' => 5,'l' => 6,'k' => 3];
    
    function letters($name,$konsonants,$vocals) {
     $letterarr = str_split($name);
    
     foreach($letterarr as $letter){
    
     if (property_exists($konsonants,$letter)){
         echo($letter);
     }
     if (property_exists($vocals,$letter)){
         echo($letter);
     }
    
     }
    }
    

如果有人有任何想法为什么会发生这种情况或如何解决它? 谢谢:)

解决方法

str_split 对字节进行操作,æ 等字符在 UTF-8 中占用 1 个字节以上。

因此,如果您 str_split 这些字符,它们基本上会“一分为二”成为无效字符。只需在 count() 上运行 $letterarr 即可看到数组中有 9 个项目,而不是预期的 7 个。

解决方案是使用支持 UTF-8 的 PHP 字符串函数。只需将 str_split 更改为 mb_str_split 即可修复您的代码示例。