【问题标题】:Why should I use strtolower() rather than mb_strtolower()?为什么我应该使用 strtolower() 而不是 mb_strtolower()?
【发布时间】:2016-09-19 15:03:52
【问题描述】:

我了解strtolower()mb_strtolower() 函数之间的用法/行为差异。之前是has been asked :)

但我不明白 - strtolower 的当前目的是什么?

是否因为向后兼容而可用?还是有一些使用strtolower 更可取的用例?似乎mb_strtolower() 更安全,更通用,所以我很想在任何地方使用它......

【问题讨论】:

  • 确实向后兼容。 mb_strtolower 应该是首选,因为它可以处理像 'ç' 或 'Ä' 这样的字符
  • 有时 php 不是用 Mbstring 函数编译的
  • 可能一文不值 strtolower 更快,对大多数人来说不是决定因素,但对某些人来说可能。

标签: php


【解决方案1】:

不是真正的向后兼容性,而是能够使用没有额外加载的多字节字符串扩展的代码。所以代码的可移植性问题。

strtolower() 始终可用。 mb_strtolower() 仅在加载附加 mbstring 模块时可用。函数重载功能允许使用对strtolower() 的“通用”调用,如果这样配置,它将实际执行mb_strtolower()。所以实际上根本不需要显式编码mb_strtolower()...

这使得代码更便携,因为它可以在有或没有 mbstring 扩展的系统上运行。

【讨论】:

    【解决方案2】:

    strtolower() 是一个原生函数,与 mb_strtolower() 相比,它始终存在,只有在安装了 mbstring 模块后才可用。

    但是关于为什么应该使用一个而不是另一个的问题,这很简单。您可以同时使用它们,并且仅在需要或可用时才使用mb_strtolower()


    如果您编写脚本,则不应在脚本、文件名、数据库结构等中使用 任何 特殊字符,因为它应该与语言无关以提高可移植性,这样做可以消除操作系统之间的不一致.脚本在其他环境中的行为可能有所不同,例如,Linux 在 fs/db 操作上区分大小写,而 Windows 则不。

    脚本应该 必须处理自己的特殊字符,因为这是不必要的,它会:

    • 性价比,strtolower()mb_strtolower()快很多
    • 如果 mbstring 在服务器上不可用,则失去可移植性。

    例如,如果您使用其他系统,例如 PSR-4 autoloader

    $var = new \ns\ÇavA();
    

    将尝试加载“Çava.php”而不是“çava.php”,因为它无法降低大小写,因为它使用本机strtolower() 函数会造成不稳定。相反,只需保留 ASCII。


    mb_strtolower() 应该只用于用户输入/输出,而strtolower() 应该用于面向系统的大小写格式。

    这就是说; strtolower() 足以满足大多数人的需求,即使对于用户输入/输出也是如此,但随后出现的问题是在哪里以及如何应用这些数据。请记住,如果它只是为了输出给用户,那么总是有 CSS text-transform 方法。

    【讨论】:

    • “Linux 在 Windows 不区分大小写的情况下区分大小写” - 好吧,我希望您只是在谈论文件系统名称,因为通常不是正确的。请问什么是“特殊字符”?我的意思是如果您建议不要使用它们,它们是什么?他们有什么“特别”之处?最后一句话是,好吧,让我们称其为“有问题的”,好吗?
    • @arkascha 你的质疑是对的,我把它调整得更具体了。
    • Em...“升序字符”?那么所有其他 1640 万个非 ASCII 字符呢?但是好吧,让我们放弃这个问题;-)
    【解决方案3】:

    简答

    • 您并不总是确定mbstring 扩展在您的环境中可用
    • strtolower() 明显更快。

    多一点

    mbstring 扩展是一个非默认 PHP 扩展。这意味着默认情况下不启用它,但根据我的经验,我从未遇到没有启用它的托管服务提供商。

    你的问题让我想知道它们是否会在性能上有所不同,所以我写了一个快速基准函数,你可以找到here

    从我对一些随机字符串运行的几个测试来看,strtolower() 的执行速度似乎至少快 50 倍

    如果您知道您正在处理与 strtolower() 兼容的字符串,并且您拥有大量的字符串,那么可能值得检查一下 strtolower()

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2016-05-23
      • 2018-05-10
      • 2014-03-12
      • 2012-12-13
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多