4

我的脚本是用 UTF-8 编写的,它使用的 MySQL 数据库表具有排序规则 utf8_unicode_ci。现在,如果我想将$_GET/$_POST中的字符串与脚本/数据库中的“内部”字符串进行比较,甚至将某些内容放入数据库中,我是否必须检查/修复变量的编码,或者 PHP 是否已经为我做到了?

如果是前者,我可以在脚本开头简单地执行以下操作吗?

function inputToUtf8($string) {
  $detectedEncoding = mb_detect_encoding($string, 'UTF-8,ISO-8859-1', true);
  if ($detectedEncoding == 'UTF-8') {
    return $string;
  } elseif ($detectedEncoding == 'ISO-8859-1') {
    return utf8_encode($string);
  }
  throw new Exception('Invalid character encoding detected.');
}

foreach ($_GET as &$v) $v = inputToUtf8($v); unset($v);
foreach ($_POST as &$v) $v = inputToUtf8($v); unset($v);
4

2 回答 2

2

PHP 不会为您这样做,但客户端浏览器通常会这样做。以您的 HTML 页面所在的编码发送 GET/POST 数据是正常的,因此如果您为 HTML 页面正确指定了字符编码,浏览器应该并且通常也会使用相同的编码。

当然,确定比假设要好——至少如果你需要确定的话。

编辑:为了明确这一点 - 通过确保我的意思是过滤掉与您期望的字符集不匹配的字符。您应该一次只设置、期望和支持一个字符集。

于 2013-03-04T21:05:45.170 回答
1

我建议不要检测编码,因为:

  • 所有正常工作的 Web 浏览器都以与您的页面相同的编码发送数据。没有例外。
  • 检测编码不是 100% 精确的。一个字符串可以(并且通常是)在多种编码中有效,因此可能会检测到错误的编码并且转换会造成混乱。
于 2013-03-04T21:44:29.770 回答