strtolower和mb_strtolower之间有什么区别?

20
在PHP中,strtolowermb_strtolower之间有什么区别?
如果我想将提交的电子邮件地址转换为小写,我应该使用哪个函数?是否存在这样的电子邮件:Name@Domain-Test.com
如果存在这样的电子邮件,我是否仍然应该将提交的电子邮件地址转换为小写?

1
这是一个关于非MB函数和MB函数之间的区别的问题,还是关于任何邮件地址的问题? - Nico Haase
4个回答

21

strtolower() 在处理波兰字符时无效。

<?php strtolower("mĄkA"); ?>

将返回:

mĄka

最佳解决方案 - 使用 mb_strtolower()

<?php mb_strtolower("mĄkA",'UTF-8'); ?> 

将返回:

mąka

在PHP手册中查看strtolower()mb_strtolower()


7
strtolower和mb_strtolower有什么区别?
mb_*函数用于处理多字节字符串。手册上说:
与strtolower()不同,'alphabetic'是由Unicode字符属性确定的。因此,该函数的行为不受语言环境设置的影响,并且它可以转换任何具有'alphabetic'属性的字符,例如A-umlaut(Ä)。
-
是否有这样的电子邮件:Name@Domain-Test.com?
是的,我认为可能会有这样的电子邮件地址。总的来说,我发现电子邮件地址不区分大小写,所以我不会改变它们的大小写。

我收到了一封电子邮件:xxx@Gmail.com我的服务器无法向他发送电子邮件。电子邮件发送是自动生成的。 - php_noob
域名不区分大小写。理论上,发送到GoOgLE.com应该和发送到google.com一样有效。 - Frank Farmer
然而,由于电子邮件地址不区分大小写,这意味着用户可能不总是以相同的方式大写它,如果您的登录系统以区分大小写的方式将其登录凭据与数据库中的电子邮件地址进行比较,这可能会导致问题。 - Phantom Watson

6

mb_函数也可以处理多字节(Unicode)字符串。电子邮件地址不应区分大小写 - 没有太多理由将它们转换为小写。


3
根据about.com的说法,"local address" 在RFC 2821中是区分大小写的(无论MTAs在实践中是否这样处理是另一个问题),而域名是不区分大小写的。因此,最佳做法是在您计划使用的任何地址上保留大小写。但是,为了比较/评估唯一性,将其转换为小写可能是有意义的。参见:http://email.about.com/od/emailbehindthescenes/f/email_case_sens.htm - Frank Farmer

0

如果您在不告诉PHP它是unicode的情况下在unicode字符串上使用此函数,则会破坏您的字符串。特别是,2字节UTF-8字符中常见的带有波浪符的大写字母'A'将被转换为带有波浪符的小写字母'a'。

mb_strtolower()非常慢,如果您有数据库连接,可以使用它将字符串转换为小写。甚至latin1/9(iso-8859-1/15)和其他编码也是可能的。


请注明您的来源。https://www.php.net/manual/en/function.mb-strtolower.php#78906 - ALZlper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接