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

时间:2015-07-14 09:57:15

标签: php encoding utf-8 strlen multibyte-functions

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

  

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

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

  • 我将所有文件保存在“UTF-8 no BOM”
  • 第一行使用的UTF-8标题
  • 我的浏览器也说“编码: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?

1 个答案:

答案 0 :(得分:3)

默认情况下,

strlen()将返回 bytes 中字符串的长度,而不是字符...您可以通过设置mbstring.func_overload ini设置来告诉PHP从strlen()调用返回字符 ....但这是全局的,并影响许多其他函数,例如strpos()substr()(完整列表)在文档链接中)

这会对您的代码中的其他地方造成严重的不利影响,特别是如果您使用的是不了解它的第三方库,因此不建议这样做。

如果您知道自己正在使用UTF-8字符串,那么最好使用mb_*函数...(当涉及到它时)设置mbstring.func_overload只是告诉PHP使用mb_*函数替代普通字符串函数“引擎盖下”