【问题标题】:What does PHP's mb_internal_encoding actually do?PHP 的 mb_internal_encoding 实际上是做什么的?
【发布时间】:2014-03-26 06:28:06
【问题描述】:

According to the PHP website 这样做:

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

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

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

我的猜测是

  1. 表示 GET 和 POST 被视为该编码。
  2. 表示它输出到该编码。
  3. 表示它对所有多字节字符串函数使用该编码。
  4. 我不知道。为什么正则表达式与普通字符串函数不同?

如果第2点是正确的,你需要做什么:

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

如果我对 3 的理解正确,这是否意味着您这样做:

mb_internal_encoding('UTF-8')

你不需要这样做:

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

只是:

mb_strtolower($str);

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

【问题讨论】:

  • 不,这是错误的。 php.net/mb_strtolowerstring mb_strtolower (string $str [, string $encoding = mb_internal_encoding()])

标签: php string


【解决方案1】:

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 基本上为所有接受 $encoding 参数的 mb_ 函数设置了默认值。本质上,它只是设置一个全局变量(内部),其他函数从中读取,仅此而已。

最后一部分是指有一个单独的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 调用就会突然变得非常不同。

【讨论】:

  • 谢谢。 1, 2. 所以只要 mbstring.http_input = pass 并且 mbstring.http_output = pass 就可以了? 3. 我明白你在说什么,但理论上任何库也可以用 ini_set 改变事情。你在哪里画线? 4. 我应该运行 mb_regex_encoding('UTF-8') 吗? EUC-JP 是默认值,不管是什么。
  • 1、2:是的。 3. 嗯,这是一个永无止境的问题。 :) 4. 如果你没有使用任何mb_ereg 函数(我不确定你什么时候更喜欢它们而不是preg_),保持原样。
  • 谢谢,我会接受你的回答。 :-) 顺便问一下,你知道 EUC-JP 是什么吗?
  • 根据轶事证据,在我看来,PHP 的编码工具很大程度上是出于支持一些日本开发人员的需要......关于为什么这可能是默认设置的完全陷入黑暗......
  • EUC-JP(扩展 Unix 代码)将 ASCII 作为子集。也就是说,除非您在 ASCII 之外徘徊,否则您不会注意到任何差异。
猜你喜欢
  • 2011-03-11
  • 2010-11-26
  • 2015-06-23
  • 2017-12-26
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多