【发布时间】:2014-03-01 23:59:39
【问题描述】:
基本上,我想知道的是,这会不会:
echo chr(ord('a')-32);
为每一个 a-z 字母工作,在每一个可能的 PHP 安装上,每一次?
阅读此处了解一些背景信息
搜索了一会,发现PHP中更改字符串大小写的大部分问题只适用于整个单词或句子。
我有一种情况,我只需要大写 1 个单个字符。
虽然我使用 strtoupper、ucfirst 和 ucwords 之类的函数对于单个字符来说太过分了,因为它们是为处理字符串而设计的。
所以在浏览了 php.net 之后,我发现了函数 chr 和 ord 将字符转换为它们的 ascii 表示(并返回)。
玩了一会儿,我发现我可以通过以下方式将低位转换为高位
echo chr(ord('a')-32);
这只是将字符在 ascii 表中偏移 32 个位置。恰好是角色的上层版本。
我在 stackoverflow 上发布此内容的原因是,我想知道是否有任何极端情况会破坏这种简单的转换。
更改 php 脚本的字符集或类似的东西会影响结果吗?
这是$upper = chr(ord($lower)-$offset) 在 PHP 中增加字符的标准方法吗?还是有别的?
【问题讨论】:
-
而重新发明轮子的原因是?
-
不,你应该在那个范围内是安全的。为了确保您可以获取 php 的源代码分发并检查 strtoupper、ucfirst 等是如何实现的。但是,如果您没有性能限制,请使用可用的方法。因为没有像 'a' 是一个字符串而不是 PHP 中的一个字符这样的过度杀伤力,所以 strtoupper 无论如何都会在它之后退出,因为没有其他事情可做。同样:'a' 是一个字符串,而不是 PHP 中的字符。
-
除了您的解决方案过于矫枉过正(甚至可能更慢,您可能会测试...)它很可能只适用于非常小的字符集。大多数较大的字符集,如 utf-8(无论如何都应该使用)对它们的值并没有那么严格。简而言之:使用 strtoupper 因为安全、快速、经过验证。
-
只对 ASCII 安全,对 UTF-8 不安全;但是 strtoupper() 等使用 UTF-8 也不安全;但也有等效的 mb_* 函数用于处理 UTF-8 字符的大小写转换
-
您可能还需要通过将 32 添加到 ord 值来检查字符是否已经大写,然后再将其大写...内置的 strtoupper() 函数已经为您完成了这项工作