字符串函数在PHP中是安全的吗?

字符串函数在PHP中是安全的吗?,php,string,internationalization,ascii,locale,Php,String,Internationalization,Ascii,Locale,一些PHP(如strtoupper等)依赖于语言环境。但当我确实知道特定字符串仅由ASCII(0-127)字符组成时,仍然不清楚区域设置是否重要。我可以保证strtoupper('abc..xyz')将始终独立于区域设置返回abc..xyz。PHP在ASCII范围内的工作是否与语言环境无关 虽然关于strtoupper的答案对我来说很重要,但关于所有字符串函数库的问题更一般 我想确保用户选择的语言环境(在多语言网站上)不会破坏我的核心功能,这与国际化无关。PHP字符串函数将一个字节视为一个字符。

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

虽然关于strtoupper的答案对我来说很重要,但关于所有字符串函数库的问题更一般


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

PHP字符串函数将一个字节视为一个字符。在ASCII范围
0-127
中,这很好

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

PHP字符串函数在ASCII范围内的工作是否与区域设置无关

不,恐怕不行。主要的反例是可怕的土耳其人:


在最坏的情况下,您可能必须提供自己的独立于语言环境的字符串处理。调用
setlocale
以恢复到
C
或其他语言环境是一种修复方法,但是POSIX进程级语言环境模型对于现代客户端/服务器应用程序来说确实是一种不太合适的方法。

你的意思是说如果
mod_php
FastCGI
引擎运行时使用了例如
LANG=de_de
LANG=ru.koi8
?或者你的意思是其他的吗?我不知道,也许在谈到默认语言环境时,它有很多共同点,所以它可以是相同的东西。但我指的是使用setlocale()设置的区域设置。没什么可补充的。是的,如果一切顺利的话。我知道PHP函数将一个字节视为一个字符。但尽管如此,如果字符范围为128-255,则某些PHP函数的行为会因语言环境的不同而有所不同。那么,我能确定没有这样的语言环境指示PHP函数在0-127范围内的行为也不同吗?这是否意味着所有支持PHP的区域设置都有字符集,这些字符集只是ASCII的扩展版本(在0-127范围内没有修改)?@Karolis我不确定我是否理解得足以回答这个问题。我相信其他人会给出正确的答案:)(我只是在逃避我对工作的恐惧……不要告诉任何人你看到了我!)有了那个代表和我看到的答案,你应该可以得到你想要的任何工作。明白。谢谢你的回答!因此,似乎最好避免对任何内容使用主PHP字符串库。糟糕的是,其他的图书馆并不那么全面。
setlocale(LC_CTYPE, "tr_TR");
echo strtoupper('hi!');

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