一些PHP字符串函数(如strtoupper等)依赖于语言环境。但是,当我真正知道特定字符串仅由ASCII(0-127)字符组成时,区域设置是否重要仍然不清楚。我可以保证strtoupper('abc..xyz')
总是独立于区域设置返回ABC..XYZ
吗。PHP字符串函数在ASCII范围内的工作方式是否与语言环境无关?
虽然关于strtoupper
的答案对我来说很重要,但这个问题对所有字符串函数库来说更为普遍。
我想确保用户选择的区域设置(在多语言网站上)不会破坏我的核心功能,这与国际化无关。
PHP字符串函数在独立于区域设置的ASCII范围内工作是否相同?
不,恐怕不是。主要的反例是可怕的土耳其圆点I:
setlocale(LC_CTYPE, "tr_TR");
echo strtoupper('hi!');
-> 'HxDD!' ('Hİ!' in ISO-8859-9)
在最坏的情况下,您可能必须提供自己的独立于区域设置的字符串处理。调用setlocale
以恢复到C
或其他语言环境是一种修复方法,但POSIX进程级语言环境模型非常不适合现代客户端/服务器应用程序。
PHP字符串函数将一个字节视为一个字符。在ASCII范围0-127
中,这很好。
要使用UTF-8安全地处理多种语言,请使用mb_*()
函数、UTF-8库或等到2030年PHP6发布。