【发布时间】:2013-11-20 16:25:52
【问题描述】:
PHP strtolower() 函数应该将字符串转换为小写。但是,上面写着in the PHP Manual(强调):
返回字符串,所有字母字符都转换为小写。
请注意,“字母”由当前语言环境决定。这表示 在即默认的“C”语言环境中,诸如变音符号-A (Ä) 之类的字符 不会被转换。
手册在这里没有提及编码,但众所周知strtolower() 会损坏UTF-8 字符串,您应该使用mb_strtolower() 代替。
我正在寻找mbstring 扩展不可用 的解决方案,并想知道何时可以安全使用strtolower()。
感谢评论这个问题的人给我的指示,似乎 PHP 源代码的相关部分是对 ctype.h 库中的 tolower() 函数的调用。 library documentation 说(强调):
如果 tolower() 的参数表示一个大写字母,存在 对应的小写字母 (由 program locale category LC_CTYPE ),结果应该是对应的 小写字母。
根据我的测试,在 PHP 中,set_locale( LC_CTYPE, 'C' ); 字符如 Ä(以 ISO-8859-1 编码)保持不变。但在其他一些语言环境中,该函数返回小写的ä(同样,在 ISO-8859-1 中)。无论如何,将语言环境更改为使用 UTF-8 字符集不会使 PHP strtolower() 可以处理 UTF-8 字符 Ä。
考虑到与 I18N 相关的问题和多语言环境的数量不断增加,这些信息可能至关重要。许多应用程序依赖strtolower() 进行简单的不区分大小写的检查。考虑:
$_POST['username'] = 'Michèlle';
if ( strtolower( $_POST['username'] ) == $database['username'] ) ...
现在,根据编码、语言环境和可能的其他一些变量,上述代码将在某些环境中有效,但在其他环境中无效。
问题是:鉴于 PHP 的 strtolower() 函数使用 ctype.h 库的 tolower 函数,这取决于“程序语言环境类别”,什么时候可以安全地指望这个函数?在以下情况下是否可以指望该行为?
- 字符串是ASCII
- 字符串以 ISO-8859-1 编码
- 字符串以其他编码和相应的语言环境集进行编码。
(编辑:问题于 2013 年 11 月 26 日完全改写。)
【问题讨论】:
-
PHP是开源的,请在源码中找到。
-
@AmalMurali 其实工作在这里完成:lxr.php.net/xref/PHP_TRUNK/ext/standard/string.c#1376
-
"请注意,'字母'由当前语言环境决定"。所以你可能想看看这个名为setlocale 的函数。它报告“用于字符分类和转换的 LC_CTYPE,例如 strtoupper()”,所以我猜 strtolower 也是如此。看一下,因为对于语言环境,您还可以指定编码,所以也许它会有所帮助
-
@KevinCittadini 谢谢,我知道这个函数和语言环境,但这仍然不能回答字符集以及它们在这里如何使用的问题。
标签: php c encoding locale ctype