【问题标题】:Are string functions ASCII-safe in PHP?PHP中的字符串函数是ASCII安全的吗?
【发布时间】:2011-09-05 03:00:24
【问题描述】:

一些 PHP string functions(如 strtoupper 等)依赖于语言环境。但是当我确实知道特定字符串仅由 ASCII (0-127) 字符组成时,仍然不清楚语言环境是否重要。我可以保证strtoupper('abc..xyz') 将始终返回ABC..XYZ 独立于语言环境。 PHP string functions 在 ASCII 范围内的工作方式是否与语言环境无关?

虽然关于strtoupper 的答案对我来说很重要,但这个问题对于所有字符串函数库更为普遍。

我想确保用户选择的区域设置(在多语言网站上)不会破坏与国际化无关的核心功能。

【问题讨论】:

  • 您的意思是 mod_phpFastCGI 引擎是否与例如运行LANG=de_DE 还是 LANG=ru_RU.koi8?还是你的意思是别的......?
  • 我不知道,也许在谈到默认语言环境时它有很多共同点,所以它可以是一回事。但我的意思是使用 setlocale() 设置的语言环境。

标签: php string internationalization ascii locale


【解决方案1】:

PHP 字符串函数将一个字节视为一个字符。在 ASCII 范围内 0-127 没问题。

要使用 UTF-8 安全地处理多种语言,请使用 mb_*() 函数、UTF-8 库或等到 2030 年 PHP6 发布。

【讨论】:

  • 这个。没什么可补充的。是的,2030 年,如果一切顺利
  • 我了解PHP函数将一个字节视为一个字符。但尽管如此,如果字符范围为 128-255,一些 PHP 函数的行为会因语言环境而异。那么,我可以确定没有这样的语言环境可以指示 PHP 函数在 0-127 范围内的行为也不同吗?这是否意味着所有 PHP 支持的语言环境都有字符集,它们只是 ASCII 的扩展版本(在 0-127 范围内没有修改)?
  • @Karolis 我不确定我是否理解到足以回答。我相信其他人会给出正确的答案:)
【解决方案2】:

PHP 字符串函数在独立于语言环境的 ASCII 范围内是否同样工作?

不,恐怕不会。主要的反例是可怕的土耳其语dotted-I

setlocale(LC_CTYPE, "tr_TR");
echo strtoupper('hi!');

-> 'H\xDD!' ('Hİ!' in ISO-8859-9)

在最坏的情况下,您可能必须提供自己的与语言环境无关的字符串处理。调用 setlocale 以恢复到 C 或其他一些语言环境是一种修复,但 POSIX 进程级语言环境模型非常不适合现代客户端/服务器应用程序。

【讨论】:

  • (我只是在逃避我对工作的恐惧……别告诉任何人你看到了我!)
  • 这位代表和我所看到的答案的老兄应该能够得到任何你想要的工作。
  • 清除。感谢您的回答!因此,似乎最好避免将主要的 PHP 字符串库用于任何事情。不好的是其他库没有那么全面。
猜你喜欢
  • 1970-01-01
  • 2013-05-27
  • 2012-01-23
  • 2012-07-23
  • 1970-01-01
  • 2017-11-20
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多