PHP的mb_internal_encoding实际上做了什么?

时间:2014-03-26 06:28:07

标签: php string

According to the PHP website它这样做:

  

encoding是用于HTTP输入的字符编码名称   字符编码转换,HTTP输出字符编码   转换,以及字符串函数的默认字符编码   由mbstring模块定义。你应该注意到内部   编码与多字节正则表达式完全不同。

有人可以用更简单的术语解释一下吗?

  1. HTTP输入字符编码转换
  2. HTTP输出字符编码转换
  3. 字符串函数的默认字符编码
  4. “内部编码与多字节正则表达式完全不同”是什么意思?
  5. 我猜是

    1. 表示GET和POST被视为该编码。
    2. 表示它输出到该编码。
    3. 表示它对所有多字节字符串函数使用该编码。
    4. 我不知道。为什么正则表达式与普通字符串函数不同?
    5. 如果第2点是正确的,您需要这样做:

      ini_set('default_charset', 'UTF-8');
      

      如果我理解正确的话,那就意味着:

      mb_internal_encoding('UTF-8')
      

      您不需要这样做:

      mb_strtolower($str, 'UTF-8');
      

      只需:

      mb_strtolower($str);
      

      我在另一篇SO帖子上读过mb_strtolower($ str)不应该被信任,你需要为每个多字节字符串函数设置编码。这是真的吗?

1 个答案:

答案 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电话会突然表现得非常不同。