PHP和UTF-8字符串函数没有mb函数


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

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

当UTF-8解码器读取非有效的UTF-8数据时,通常会插入替换字符。

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

  • 我保存了我所有的文件在"UTF-8 no BOM"
  • 第一行使用UTF-8报头
  • 我的浏览器也显示"Encoding: UTF-8"

这是我的代码:

<?php
header("Content-Type: text/html; charset=utf-8");
$test = 'Ä';
echo strlen($test);
var_dump($test);
?>

我的问题:我可以使用正常的php函数与UTF-8或必须我使用"mb"-函数?

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

strlen()将在默认情况下以字节返回字符串的长度,而不是字符…您可以通过设置mbstring来改变这一点。func_overload ini设置告诉PHP从strlen()调用返回字符 ....但这是全局的,并且也影响许多其他函数,如strpos()substr()(完整列表在文档链接中)

这可能会在代码的其他地方产生严重的不利影响,特别是如果您使用的是不知道它的第三方库,因此不建议使用

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