PHP 和没有 MB-Functions 的 UTF-8 字符串函数?

PHP and UTF-8 String functions WITHOUT MB-Functions?

我尝试在 PHP 中使用 UTF-8,在我的网站上输出似乎没问题(测试时显示正确的 äöüß 等),但有一个简单的问题...当我使用 echo strlen("Ä"); 它显示“2”...我读了这个主题:strlen() and UTF-8 encoding 在答案中我读到这个:

The replacement character often gets inserted when a UTF-8 decoder reads data that's not valid UTF-8 data.

我想知道,为什么我的数据不是有效的 UTF-8?因为:

这是我的代码:

<?php
header("Content-Type: text/html; charset=utf-8");

$test = 'Ä';
echo strlen($test);
var_dump($test);

?>

我的问题:我可以使用带有 UTF-8 的普通 PHP-Functions 还是 必须 我使用 "mb"-函数?

如果可以使用正常的PHP-Functions,为什么在我的代码中显示 strlen() 2 而不是 1?

strlen() 默认情况下 return 字符串的长度 字节 ,而不是字符...您可以通过设置 mbstring.func_overload ini 设置告诉 PHP 到 return 字符 来自 strlen() 调用而不是......但这是全局的,并且影响了一些还有其他功能,例如 strpos()substr()(文档中的完整列表 link)

这可能会对代码中的其他地方产生严重的不利影响,特别是如果您使用的是不知道它的第 3 方库,因此不推荐这样做。

如果您知道您正在使用 UTF-8 字符串,那么最好使用 mb_* 函数......并且(当涉及到它时)设置 mbstring.func_overload 只是告诉PHP 使用 mb_* 函数作为普通字符串函数的替代 "under the hood"