According to the PHP website它这样做:
encoding是用于HTTP输入的字符编码名称 字符编码转换,HTTP输出字符编码 转换,以及字符串函数的默认字符编码 由mbstring模块定义。你应该注意到内部 编码与多字节正则表达式完全不同。
有人可以用更简单的术语解释一下吗?
我猜是
如果第2点是正确的,您需要这样做:
ini_set('default_charset', 'UTF-8');
如果我理解正确的话,那就意味着:
mb_internal_encoding('UTF-8')
您不需要这样做:
mb_strtolower($str, 'UTF-8');
只需:
mb_strtolower($str);
我在另一篇SO帖子上读过mb_strtolower($ str)不应该被信任,你需要为每个多字节字符串函数设置编码。这是真的吗?
答案 0 :(得分:7)
mbstring扩展添加了光荣的想法(</sarcasm>
),以自动将所有传入数据和所有输出数据从某些编码转换为另一种编码。见mbstring HTTP Input and Output。它已使用mbstring.http_input
ini设置并使用mb_output_handler
进行配置。 mb_internal_encoding
会影响此次转化。 IMO你应该关闭这些设置,永远不要触摸它们;我还没有找到任何可以通过优雅方式解决的问题,并且听起来总体来说隐藏编码转换是一个糟糕的想法。特别是如果它全部通过在各种不同背景下使用的一个全局标志(mb_internal_encoding
)进行控制。
那就是1.和2.
对于3.,的确如此,mb_internal_encoding
基本上为接受mb_
参数的所有$encoding
函数设置默认值。基本上它只是设置一个全局变量(内部),其他函数从中读取,这就是全部。
最后一部分指的是有一个单独的mb_regex_encoding
函数来设置mb_ereg_
函数的内部编码。
我确实读过另一篇SO帖子,
mb_strtolower($str)
不应该被信任,你需要为每个多字节字符串函数设置编码。这是真的吗?
我同意这一点,因为所有的全球国家都不可信任。这是非常值得信赖的:
mb_internal_encoding('UTF-8');
mb_strtolower($string);
然而,事实并非如此:
mb_strtolower($string);
看到区别?如果你依赖于在其他地方正确设置全局状态,你永远无法确定 是否正确。您只需要打电话给某个第三方库,在您不知情的情况下将mb_internal_encoding
设置为其他内容,并且您的mb_strtolower
电话会突然表现得非常不同。