2013-03-04 62 views
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); 
+0

我不知道这个函数是否会抛出异常。 mb_detect_string的返回值被解释为'检测到的字符编码'或者'如果不能从给定字符串检测到编码'则返回FALSE'。但是如果字符串不是有效的UTF-8,它总是返回'ISO-8859-1'。 – 2013-03-06 12:59:06

回答

2

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

当然,最好确定而不是假设 - 至少如果你需要确定它。

编辑:为了清楚这一点 - 确保我的意思是过滤出与您期望的字符集不匹配的字符。您应该一次设置,期望并且仅支持一个字符集。

+0

没有办法确定,因为检测编码只是猜测。它不会帮助你,只是在检测到错误的编码时创建另一个潜在的问题。 – amik 2013-03-04 21:44:23

+0

@ user1660584我不是在谈论检测 - 我是在谈论如何筛选出未知的字符,如果你需要确保只有正确的字符正在工作。猜猜我可以做得更清楚。 – eis 2013-03-04 21:49:15

+0

那么,在这种情况下,你不应该使用utf8_encode既不检测编码。您可能正在寻找一个删除所有不需要的字符的正则表达式(它也不清楚什么是未知字符 - 是的,在UTF8中,您可能具有完全无效的序列,但通常每个charcode都是一些具有某种含义的字符)。 – amik 2013-03-06 18:53:22

1

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

  • 所有工作正常的网页浏览器在相同的编码发送数据,您的网页。没有例外。
  • 检测编码不是100%准确。一个字符串可以(并且通常是)在多种编码中有效,因此可能会检测到错误的编码,并且转换会造成混乱。
+0

说没有例外是错的。也有例外情况,例如1)http头内容类型,可能存在也可能不存在,因为用户可以在本地保存页面,2)表单接受编码字符集参数可以与页面charset相矛盾,3)页面可以是它指定的不同编码,4)用户可以刚刚从浏览器选项变为不同的编码。但是*通常*数据使用相同的编码发送。 – eis 2013-03-04 21:55:38

+0

1)好的,不要在HTML头中指定编码。好吧,它可能会导致你陷入困境。2)是的,但你仍然知道你的PHP将会得到什么编码。 3)那么页面也被错误地显示,这通常是更大的问题。 4)是的,他也可以通过telnet发送HTTP请求。 我的观点是,如果你的页面被正确写入,并且用户没有试图破解它,你总是知道你会收到什么编码,真的没有例外。但是,感谢您提供额外的信息,您是真实的,但我担心这不是这种情况。 – amik 2013-03-06 18:50:45

+0

4日,我看到一个用户偶然发生的情况,它不必是恶意的。或者由于一些不适当的建议或误解。我认为这比使用telnet发送HTTP请求更经常发生。但是,好的,这已经不是了。 :) – eis 2013-03-06 19:17:30